微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Node.js 12.x AWS lambda 不使用 firebase-admin 实时数据库返回

我已经被这个问题困扰了好几天了,几乎没有进展,如果可以,请帮忙!

我有一个 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 not;
  • 使用 promise 级联函数将一堆.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 方法):ETIMEDOUTECONNREFUSED

下面是我的工作,但仍然没有运气。我已经删除了缓存代码,因为我知道它可以正常工作。您看到的 settimeout 是我联系这里之前最后的选择。

const admin = require("firebase-admin");
admin.initializeApp({
    credential: admin.credential.applicationDefault(),databaseURL: "https://{projectName}.firebaseio.com"
});
var result = [];
exports.handler = (event,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);
    }
};

解决方法

您似乎没有在函数的根级别存储或使用 setTimeout。您应该存储它,以便回调函数可以继续运行,因为它只在它在作用域内时才存在。这样做还需要您绑定对象,以便在您决定将其推入数组以进行多个回调时拥有自引用

var result = [];
var timeOut;
//...
timeOut = setTimeout(() => {
            admin.database().goOffline();
            admin.app().delete();
            callback(error);
        }.bind(this),2000);

来源:MSDN Function.prototype.bind()

如果 Binding 不是解决方案,而您想要一个阻塞方法,您可能对延迟函数感兴趣,它的行为与 setTimeout 相同,但适用于 promise

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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?