【发布时间】:2021-07-24 18:47:38
【问题描述】:
我在这个问题上被困了几天,几乎没有进展,如果可以的话,请帮忙!
我有一个 Node.js (v12) AWS Lambda,它需要从我的 Firebase 实时数据库中提取数据,并将每条记录处理到 Redis 缓存中(如果它尚不存在)。该函数启动但从未完成,而是从 AWS 收到 Task timed out after 180.10 seconds。
我尝试过的事情:
- 使用
exports.handler = async function(event)与exports.handler = function(event, context, callback); - 对于上面的同步尝试,我尝试使用
context.callbackWaitsForEmptyEventLoop = false与不; - 使用 promises 对级联函数 对将一堆
.then()拼接在一起; - 将
firebase-admin与https模块与 Firebase REST API 结合使用; - 稍后使用
settimeout触发回调对比不; - 将
GOOGLE_APPLICATION_CREDENTIALS环境变量设置为我的服务帐户凭据与直接在代码中引用文件; - 我什至将 Lambda 本身的内存和超时时间增加到了它可以达到的最大值,并将我想从 Firebase 提取的数据减少到只有 1 条记录。
根据上述尝试,我得到的回应:
- AWS(最频繁):
Task timed out after 180.10 seconds; - AWS(
.then拼接方式):Function completed successfully(但没有实际处理数据); - 节点 HTTPS(REST API 方法):
ETIMEDOUT或ECONNREFUSED;
下面是我的目标,但仍然没有运气。我已经删除了缓存代码,因为我知道它可以正常工作。你看到的settimeout 是我到达这里之前的最后手段。
const admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://{projectName}.firebaseio.com"
});
var result = [];
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
try {
admin.database().ref("data").orderByChild("timestamp").limitToLast(1).once("value", snapshot => {
if (snapshot.exists()) {
console.log('snapshot exists...');
let posts = snapshot.val();
result = Object.keys(posts);
}
setTimeout(() => {
admin.database().goOffline();
admin.app().delete();
callback(null, `Success! ${JSON.stringify(result)}`); // <-- NEVER RETURNS
}, 2000);
}, error => {
setTimeout(() => {
admin.database().goOffline();
admin.app().delete();
callback(error); // <-- NEVER RETURNS
}, 2000);
});
} catch (error) {
setTimeout(() => {
admin.database().goOffline();
admin.app().delete();
callback(error); // <-- NEVER RETURNS
}, 2000);
}
};
【问题讨论】:
标签: javascript node.js firebase-realtime-database aws-lambda firebase-admin