注意,对于使用aws的新版本的"firebase-admin": "^5.0.0",即使成功地触发了回调,进程也不会退出:
var admin = require("firebase-admin");
var serviceAccount = require("./your-creds.json");
var admin = require("firebase-admin");
var serviceAccount = require("./your-creds.json");
if(admin.apps.length == 0) {
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "your DB.com"
});
}
module.exports.hello = (event, context, callback) => {
admin.database().ref('/').set({
username: "stackoverflow",
email: "test@mail.com"
}).then((data)=>{
callback(null, { statusCode: 200});
context.succeed();
}).catch((err) => {
console.log(err);
callback({ statusCode: 500});
context.fail();
})
}发布于 2018-01-28 21:19:57
更新1评论:
按照下面的链接,它是允许Node.js执行非阻塞I/O操作的事件循环。https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
当您使用admin.database()初始化防火墙时,它似乎初始化了这个repo:https://github.com/firebase/firebase-js-sdk/blob/72cd164614b3eef29012c6343fd38ce38fef46d6/packages/database/src/core/Repo.ts,它必须为事件循环的某些不同阶段设置正在进行的操作,例如poll来维护持久的websocket连接(猜测)
而且,由于lambda函数在node.js事件循环为空之前从未退出,即使调用了callback方法,函数调用也不会退出:
调用回调时,Lambda函数仅在Node.js事件循环为空后才退出。
显然,设置context.callbackWaitsForEmptyEventLoop = false;可以解决这个问题,但在我的情况下并非如此:
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
callbackWaitsForEmptyEventLoop:
默认值为true。此属性仅用于修改回调的默认行为。默认情况下,回调将等待Node.js运行时事件循环为空,然后冻结进程并将结果返回给调用方。您可以将此属性设置为false,以请求AWS Lambda在调用回调后不久冻结进程,即使事件循环中存在事件。AWS将冻结Node.js事件循环中的进程、任何状态数据和事件(在下一步调用Lambda函数时处理事件循环中的任何剩余事件,如果AWS选择使用冻结的进程)。有关回调的详细信息,请参阅使用回调参数。
但是,调用admin.app().delete()可以释放所有资源,这将清除事件循环并允许lambda函数退出。
删除:
使此应用程序不可用,并释放所有相关服务的资源。
https://firebase.google.com/docs/reference/js/firebase.app.App#delete
因此,如果我将代码更改为下面的代码,则在回调之后退出:
admin.database().ref('/').set({
username: "stackoverflow",
email: "test@mail.com"
}).then((data)=>{
admin.app().delete().then(callback(null, { statusCode: 200}))
}).catch((err) => {
console.log(err);
})原文评论:
如下面所示,使用process解决了这个问题。如果有人知道发生这种情况的原因,请详细说明:
var admin = require("firebase-admin");
var serviceAccount = require("./your-creds.json");
var admin = require("firebase-admin");
var serviceAccount = require("./your-creds.json");
if(admin.apps.length == 0) {
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "your DB.com"
});
}
module.exports.hello = (event, context, callback) => {
admin.database().ref('/').set({
username: "stackoverflow",
email: "test@mail.com"
}).then((data)=>{
callback(null, { statusCode: 200});
context.succeed();
process.exit(0); //<--------
}).catch((err) => {
console.log(err);
callback({ statusCode: 500});
context.fail()
process.exit(1); //<--------
})
}https://stackoverflow.com/questions/48491432
复制相似问题