Javascript Node.js 12.x AWS lambda不会使用firebase admin实时数据库返回
我已经在这个问题上纠缠了好几天,几乎没有进展,如果可以的话,请帮助我 我有一个Node.js(v12)AWS Lambda,它需要从我的Firebase实时数据库中提取数据,并将每条记录处理到Redis缓存中(如果它还不存在的话)。该功能启动但从未完成,相反,我收到AWS发出的任务在180.10秒后超时 我尝试过的事情:Javascript Node.js 12.x AWS lambda不会使用firebase admin实时数据库返回,javascript,node.js,firebase-realtime-database,aws-lambda,firebase-admin,Javascript,Node.js,Firebase Realtime Database,Aws Lambda,Firebase Admin,我已经在这个问题上纠缠了好几天,几乎没有进展,如果可以的话,请帮助我 我有一个Node.js(v12)AWS Lambda,它需要从我的Firebase实时数据库中提取数据,并将每条记录处理到Redis缓存中(如果它还不存在的话)。该功能启动但从未完成,相反,我收到AWS发出的任务在180.10秒后超时 我尝试过的事情: 使用exports.handler=异步函数(事件)与exports.handler=函数(事件、上下文、回调) 对于上面的同步尝试,我尝试使用context.callbac
- 使用exports.handler=异步函数(事件)与exports.handler=函数(事件、上下文、回调)李>
- 对于上面的同步尝试,我尝试使用
与进行对比李>context.callbackaitsforeptyeventloop=false
- 使用承诺与级联函数与缝合一堆
李>。然后()
- 将
与firebase admin
模块与firebase REST API结合使用李>https
- 使用
稍后启动回调而不是不启动李>settimeout
- 将
环境变量设置为我的服务帐户凭据而不是直接在代码中引用文件李>GOOGLE\u APPLICATION\u CREDENTIALS
- 我甚至将Lambda本身的内存和超时增加到了它能达到的最大值,并将我想从Firebase提取的数据减少到只有一条记录
- 对于上面的同步尝试,我尝试使用
- AWS(最频繁):
李>任务在180.10秒后超时
- AWS(
缝合方法):。然后
(但没有实际处理数据)李>功能成功完成
- 节点HTTPS(restapi方法):
或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);
}
};
const admin=require(“firebase管理员”);
admin.initializeApp({
凭据:admin.credential.applicationDefault(),
数据库URL:“https://{projectName}.firebaseio.com”
});
var结果=[];
exports.handler=(事件、上下文、回调)=>{
context.callbackhaitsforemptyeventloop=false;
试一试{
admin.database().ref(“数据”).orderByChild(“时间戳”).limitToLast(1)。一次(“值”,快照=>{
if(snapshot.exists()){
log('snapshot exists…');
让posts=snapshot.val();
结果=Object.keys(posts);
}
设置超时(()=>{
admin.database().goOffline();
admin.app().delete();
回调(null,`Success!${JSON.stringify(result)}`);//{
设置超时(()=>{
admin.database().goOffline();
admin.app().delete();
回调(错误);//{
admin.database().goOffline();
admin.app().delete();
回调(错误);//您似乎没有在函数的根级别存储或使用setTimeout。您应该存储它,以便回调函数可以继续运行,因为它只在作用域中存在。执行此操作还需要绑定对象,以便在您决定将其推入数组进行多次回调时具有自引用
var结果=[];
var超时;
//...
超时=设置超时(()=>{
admin.database().goOffline();
admin.app().delete();
回调(错误);
}.bind(this),2000年);
资料来源:
如果绑定不是一个解决方案,并且您需要一个阻塞方法,那么您可能会对延迟函数感兴趣,它的行为与setTimeout相同,但与承诺一起工作
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Async function solution
await sleep(2000);
console.log('Two seconds later, showing sleep in a loop...');
// non-Async solution
sleep(2000)
.then(()=> {
admin.database().goOffline();
admin.app().delete();
callback(error);
})
.catch(e => console.log(e));
感谢您的DIGI Byte回复,bind函数似乎无法设置在您上面的位置-我收到了一个错误:,“预期。
。有没有更好的方法来实现您提到的绑定?对于其他全面的答案,我建议您使用另一个答案-请让我知道这些方法是否可行ernative是使函数与延迟函数异步-为承诺延迟添加了代码不幸的是,我仍然收到超时错误数字字节-您认为有更好的方法来实现相同的目标吗?是否有可能被cors策略阻止或配置错误?