我阅读了其他有关FIR超时的SO帖子,其中一些是由于对firebase-functions
或firebase-admin
进行了更新。我更新到了最新版本,甚至降级到了可以正常工作的原始版本(git checkout)。
这些都不起作用。
我的任何FIR函数都收到Function execution took 60002 ms, finished with status: 'timeout'
错误(当请求在邮递员中运行时)
示例代码:
exports.BSGetRequest = functions.https.onCall((url, context) => {
console.log(url);
const options = {
method: 'GET',
uri: url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'MY_PRIVATE_KEY'
},
json: true
};
return rp(options)
.then(function (response) {
console.log({ response });
return repos;
})
.catch(function (err) {
console.error({ err });
return err
});
});
我怀疑当Firebase Functions用户界面也发生变化(在控制台中;我认为有一个重大更新)或者我的语法跟不上Node 6时,它开始发生。
更新:
FIR功能再次开始工作,但我没有做任何更改。案件结案。我希望这与我的付费计划订阅有关。
答案 0 :(得分:0)
由于response
不是对象并且没有body
属性,因此可能会引发您的UPDATED错误消息。
error
变量中可能有一些您没有检查的消息。
我已经通过一些注释和调试对您的代码进行了一些细分,这将有助于您深入了解。
该请求将因抛出错误而不能通过promise
返回拒绝或响应。
exports.BSGetRequest = functions.https.onCall((url, context) => {
const options = {
url: url,
headers: {
'Content-Type' : 'application/json',
'Accept': 'application/json',
'Authorization': 'MY_PRIVATE_KEY'
},
json: true
};
return new Promise(function (fullfilled, rejected) {
request.get(options, function (error, response, body) {
const decoded = he.decode(JSON.stringify(response.body));
if (!error && response.statusCode >= 200 && response.statusCode <= 300) {
fullfilled(JSON.parse(decoded));
return;
}
// What's in `error`?
console.error({ error });
// I'm guessing this is where the error is - What's in `response` - Is there a `body`?
console.log({ response });
const responseErrorMessage = he.decode(JSON.stringify(response.body));
const responseError = new functions.https.HttpsError('invalid-argument', responseErrorMessage);
rejected(responseError);
})
});
});
编辑:尝试抛出错误消息;
exports.BSGetRequest = functions.https.onCall((url, context) => {
const options = {
url: url,
headers: {
'Content-Type' : 'application/json',
'Accept': 'application/json',
'Authorization': 'MY_PRIVATE_KEY'
},
json: true
};
return new Promise(function (fullfilled, rejected) {
request.get(options, function (error, response, body) {
const decoded = he.decode(JSON.stringify(response.body));
if (!error && response.statusCode >= 200 && response.statusCode <= 300) {
fullfilled(JSON.parse(decoded));
return;
}
// This should handle your error correctly.
if (error) {
const throwError = new functions.https.HttpsError('invalid-argument', error);
rejected(throwError);
return;
}
const responseErrorMessage = he.decode(JSON.stringify(response.body));
const responseError = new functions.https.HttpsError('invalid-argument', responseErrorMessage);
rejected(responseError);
})
});
});