如何知道node.js表达服务器的时间已经准备就绪

Bri*_*ian 21 javascript node.js express

有一个应用程序,我想启动节点快速服务器,然后在服务器启动后自动在同一台机器上启动浏览器.如何查询服务器是否已准备就绪?我真的希望在.listen调用上有某种回调,但似乎不是.我可以等待比我预期的时间更长的时间,但这将是在现场的设备,所以我要么等待一段荒谬的时间,以确保我启动并运行,然后开始浏览器或者让用户足够智能,如果页面加载不正确则点击刷新.这些都不是我的好选择...

我在线阅读API,但没有看到这样的内容.当然有一个我不知道的技巧可以做到这一点.

如果节点HTTP api(其具有回调并告诉我有关侦听事件)是快速对象的基础,则可能存在未记录的快速呼叫侦听的回调选项.或许我应该知道它就在那里.

任何帮助将不胜感激.

Tim*_*ple 32

新快报app.listen功能支持回调.它将您传入的参数映射到http.listen调用.

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Run Code Online (Sandbox Code Playgroud)

所以你可以打电话: app.listen(port, callback);

或者你可以直接使用http.listen.

var app = require('express')(),
    server = require('http').createServer(app);

server.listen(80, function() {
    console.log('ready to go!');
});
Run Code Online (Sandbox Code Playgroud)

  • 您将添加错误侦听器.类似于:`server.listen(80).on('error',function(err){});` (2认同)

dio*_*ney 7

您可以使用http.listen具有回调函数的方法,该函数在服务器就绪后触发:

http.createServer(app).listen(app.get('port'), function () {
    console.log('Printed when ready!!!');
});
Run Code Online (Sandbox Code Playgroud)

请参阅Node.js上的官方参考:

http://nodejs.org/api/all.html#all_server_listen_port_hostname_backlog_callback

http://nodejs.org/api/all.html#all_server_listen_path_callback_1

http://nodejs.org/api/all.html#all_server_listen_handle_callback_1


Pet*_*ons 6

正如许多人所提到的,该listen函数(在快速应用程序或http服务器上都支持它)确实支持回调,这将使您的节点进程知道何时正在侦听.

因此,如果您打算从快递应用程序中启动浏览器,请在那里进行,并且您很好.但是,如果您从外部脚本启动Express应用程序,然后希望该外部脚本打开浏览器,则节点回调并不会真正为您带来任何收益.

在等待良好的HTTP响应时,在stdout上等待一些魔术字符串并不是真正的改进.您也可以使用try/backoff/timeout循环,curl直到获得成功的响应.


P.B*_*key 6

server.on('listening', function() {
  resolve();//I added my own promise to help me await
});
Run Code Online (Sandbox Code Playgroud)

聆听活动对我很有效。注意我添加了我自己的 Promise。我想您可以通过向此侦听器添加入口点来获得类似的结果,而无需承诺。

请注意,我尝试了更直观的方法server.on('listen'),但它不起作用。运行节点6.9.1


Fes*_*sto 5

您可以在服务器启动后触发自定义事件:

// server.js
const express = require('express');
const app = express();

modeule.export = app;
app.listen(3000, () => {
   app.emit('listened', null)
});
Run Code Online (Sandbox Code Playgroud)

在单独的模块中,应用程序可以监听您的自定义事件:

// custom.js
const server = require('server.js');
server.on('listened', function() {
  console.log('The server is running!');
});
Run Code Online (Sandbox Code Playgroud)