Node Js:如何在服务器启动时异步执行函数

Posted

技术标签:

【中文标题】Node Js:如何在服务器启动时异步执行函数【英文标题】:Node Js: how to execute functions async in the start of the server 【发布时间】:2018-01-03 16:22:58 【问题描述】:

我想从导出的文件中运行一个函数作为应用程序中的第一个函数(异步方式)。

这个函数必须在运行服务器时首先执行,并且会询问我们是本地环境还是生产环境!

函数在配置文件中:

//config/config.js:

const readline = require('readline');

const rl = readline.createInterface(
  input: process.stdin,
  output: process.stdout
);
module.exports= function(next) 
    console.log("call fi,n");
    rl.question('Run in production environnement (Y|N) ?', (answer) => 
        if(answer === "Y")
            process.env.NODE_ENV = 'prod';
        else
            process.env.NODE_ENV = 'dev';
        rl.close();
        console.log("asnwerere");
        next();
    ,next);




//app.js:
app.use(function(next)
    require('./config/config')(next);
); 

现在的第一个问题是该函数不是在启动服务器时运行而是在接收到HTTP请求时。

那么问题是如何让这个函数以异步方式运行:作为应用程序的第一个函数(必须阻塞服务器,直到我引入这个函数中提到的命令行)?

【问题讨论】:

向我们展示您的next 变量声明。 您的错误显示为require('./config/config')(next);,但您向我们显示的代码是require('./config/database')(next);。这两个是不同的。您是否 100% 确定您正在查看错误的正确代码?您向我们展示的内容应该有效,并且不应导致该错误。我认为您正在查看错误的代码行,并且错误出现在不同的位置。 感谢您的合作,是的,您是对的,我一直在寻找错误的代码,我已经在问题中重新提出了问题,但现在我的问题是我希望我的函数在服务器启动时异步但是我的函数现在在收到 HTTP 请求时正在运行。 将来,当直接向我发表评论时,请将@username 放在评论的前面,以便我收到通知。否则,我永远不知道你发表了评论给我看。 app.use() 定义中间件。中间件在请求处理期间运行,而不是在服务器启动时运行。这就是它的作用。如果您希望在服务器启动时运行某些东西,那么不要将代码放在中间件中。把它放在你的服务器启动时运行的代码中,比如你把app.listen()放在同一个地方。 【参考方案1】:

这个函数签名

app.use(function(next)...);

错了。应该是:

app.use(function(req, res, next)...);

所以,因为你的函数参数错误,你使用了错误的东西 next 并且当有人试图调用它时会出错。

所以,在你的代码中改变这个:

//app.js:
app.use(function(next)
    require('./config/config')(next);
); 

到这里:

//app.js:
app.use(function(req, res, next)
    require('./config/config')(next);
);    

【讨论】:

以上是关于Node Js:如何在服务器启动时异步执行函数的主要内容,如果未能解决你的问题,请参考以下文章

node.js 在执行'n'异步回调后执行函数

node js - 当函数依赖于内部的异步函数时,如何从函数返回值

Node.js - 为啥我的一些回调没有异步执行?

即使在事件循环中没有要执行的回调,Node.js Web 服务器如何保持运行?

当循环中调用了异步函数时,Node.JS 将如何处理循环控制?

Node.js 回调函数