如何在Google Cloud Datastore .get上设置超时?

时间:2018-09-28 14:22:28

标签: node.js google-cloud-platform google-cloud-datastore try-catch

我只是从一些Google云服务开始,我正在尝试从数据存储区中获取实体。

如果客户端可以连接互联网,则一切正常。

但是我想在由于任何原因(例如互联网)而导致客户端无权访问数据存储的情况下添加try catch语句。

这是我的代码:

try{
    let search = datastore.key(['Client', Client_id])           
    datastore.get(search, /*{timeout: 1000},*/ function (err, entity) {
        console.log('limit >>>', entity.limit)
        evt.emit('comparedate', res, entity.limit)    
    });
}
catch(error){
    console.log('Error >>>', error)
}

我的问题是:连接尝试没有时间限制。当客户端无法访问Internet时,请求将永远保持“待处理”状态,并且不会进入捕获状态。

我尝试了一些参数,例如:Global#CallOptions,但没有成功。

感谢您的帮助!

编辑>>>>我知道这不是最值得信赖的方法。但是现在我用以下代码解决了:

evt.on('isonline', (res) => {
    try{
        require('dns').lookup('google.com',function(err) {
            if (err && err.code == "ENOTFOUND") {
                console.log('NO INTERNET')
                evt.emit('readofflinedata', res)
            } else {
                console.log('WITH INTERNET')
                evt.emit('readonlinedata', res)
            }
        })
    }
    catch(error){
        res.status(200).send({ error: true, message: error.message })
    }   
})

2 个答案:

答案 0 :(得分:3)

数据存储区客户端使用内部称为google-gax的库。您可以配置超时/等。通过传入gax options

datastore.get(key, {
  gaxOptions: {timeout: 1000}
}, (err, entity) => {
  // ...
});

答案 1 :(得分:2)

我在数据存储区的get函数中未找到任何添加超时的参数。但是,您可以使用Promise并设置一个计时器,如果该函数的执行时间过长,则会将其停止。

var Promise = require("bluebird");
var elt = new Promise((resolve, reject) => {
   fun(param, (err) => {
     if (err) reject(err);
     doSomething(); // <- datastore.get() funtion
     resolve();
});

elt.timeout(1000).then(() => console.log('done'))
                 .catch(Promise.TimeoutError, (e) => console.log("timed out"))