首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >firebase-admin退出过程nodejs

firebase-admin退出过程nodejs
EN

Stack Overflow用户
提问于 2018-01-28 21:18:34
回答 1查看 1.1K关注 0票数 1

注意,对于使用aws的新版本的"firebase-admin": "^5.0.0",即使成功地触发了回调,进程也不会退出:

代码语言:javascript
复制
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();
})
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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方法,函数调用也不会退出:

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-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

因此,如果我将代码更改为下面的代码,则在回调之后退出:

代码语言:javascript
复制
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解决了这个问题。如果有人知道发生这种情况的原因,请详细说明:

代码语言:javascript
复制
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); //<--------
})
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48491432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档