我只是从一些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 })
}
})
答案 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"))