编程实现停止和重新启动Express服务器(以更改端口)

49

我想要能够基本上改变我的express应用程序运行的端口。

我已经尝试过:

server.on('close', function() {
  server.listen(3000);
});

server.listen(8080);
server.close();

这会返回一个晦涩的 node.js 错误。我正在运行 node v0.4.11,现在正在升级以查看是否可以解决问题。

编辑 这是错误信息:

Assertion failed: (!io->watcher_.active), function Set, file ../src/node_io_watcher.cc, line 160.
感谢,马特。

.listen 是异步的,所以在它打开之前会尝试关闭。尝试使用 server.listen(8080, function() { server.close(); });,或许可以解决这个问题。 - loganfsmyth
断言失败:(!io->watcher_.active)函数设置,文件../src/node_io_watcher.cc,第160行。 - Matt
实际上这看起来像是0.4.11的一个错误。我已经升级到0.7.7并且它好像在工作了。@loganfsmyth,说得好 - 我不认为那是问题所在,但这可能会带来未来的问题。 - Matt
@loganfsmyth,刚才的话撤回。那似乎是问题的根源。你能把它写成答案吗?谢谢啦。 - Matt
@Matt 很高兴能帮忙,回答已发布。 - loganfsmyth
FYI:Express 的 server.listen 只是 http.server.listen 的一个包装器。适用于想要在 Google 中寻找其他解决方案的人们。 - Welcor
2个回答

62
问题在于 .listen 是异步的。通过在调用 .listen 后立即调用 .close,您在其打开之前就关闭了它。
尝试使用以下代码。
server.listen(8080, function() {
  server.close();
});

5
#close 也是异步的。它有一个回调函数,只有在服务器处理完剩余的连接后才会触发。 - rocketspacer
3
"app.close() 不再是 Express API v4 的一部分。" - Harry Moreno
2
@HarryMoreno 对的,它是Node的API的一部分 https://nodejs.org/api/net.html#net_server_close_callback 在这个问题中,server是一个Node服务器,它附加了一个express应用程序。它不是express的app本身。 - loganfsmyth
2
在这种情况下,“server”可能是通过侦听express应用程序来获得的,如Derek Hill的答案所示。 - derpedy-doo

21

多亏了@aymericbeaumet,以下代码段可与Express 4一起使用:

var app = express();

var server = app.listen(8080, function() {
  console.log('Listening :)');
  server.close(function() { console.log('Doh :('); });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接