我正在尝试在网络浏览器上呈现页面,然后退出提供该页面的Node.js express网络服务器。我在调用的函数中使用的代码是:
var express = require('express');
var router = express.Router();
router.get('/restart', function(req, res, next) {
res.render('resetTimer', {}, function() {
console.log("Render resetTimer page and exit.");
process.exit(); // kill Express webserver
});
});
然而,我正在
This site can’t be reached
localhost refused to connect.
在Web浏览器中,这表示退出是在呈现网页之前发生的,即使exit命令在回调中也是如此。如果我注释掉process.exit命令,我会看到控制台日志消息,但是如果我没有注释掉它,则不会呈现页面并且不会输出日志消息。
我错过了什么?
答案 0 :(得分:0)
当页面已切换到响应流时,将调用res.render()
回调,即使它尚未完全传递到客户端。因此,如果您在此时终止进程,则客户端交付可能无法完成。
我可以想出两种方法来解决这个问题:
为响应流上的close事件创建一个侦听器,当您收到该事件时,您将知道所有内容都已发送,您可以关闭服务器。这将不允许任何其他可能需要加载的页面资源(图像,样式表,字体等等),因为它们可能在页面加载后被请求。
在页面本身中放置一个ajax调用,以便在页面加载之后,它会进行ajax调用,然后您实际上不会重新启动服务器,直到获得ajax调用。如果您在窗口load
事件之前没有进行Ajax调用,那么您还可以确保在重新启动服务器之前已加载所有其他页面资源。
请注意,这些选项中的任何一个都允许对您的服务器进行各种DOS攻击(导致攻击者想要重启)。