Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js 12.x AWS lambda不会使用firebase admin实时数据库返回_Javascript_Node.js_Firebase Realtime Database_Aws Lambda_Firebase Admin - Fatal编程技术网

Javascript Node.js 12.x AWS lambda不会使用firebase admin实时数据库返回

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

我已经在这个问题上纠缠了好几天,几乎没有进展,如果可以的话,请帮助我

我有一个Node.js(v12)AWS Lambda,它需要从我的Firebase实时数据库中提取数据,并将每条记录处理到Redis缓存中(如果它还不存在的话)。该功能启动但从未完成,相反,我收到AWS发出的任务在180.10秒后超时

我尝试过的事情:

  • 使用exports.handler=异步函数(事件)与exports.handler=函数(事件、上下文、回调)
  • 对于上面的同步尝试,我尝试使用
    context.callbackaitsforeptyeventloop=false
    进行对比
  • 使用承诺级联函数缝合一堆
    。然后()
  • firebase admin
    https
    模块与firebase REST API结合使用
  • 使用
    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策略阻止或配置错误?