如果回调包含process.exit,则不会呈现路由页面

时间:2017-03-24 17:20:40

标签: node.js process

我正在尝试在网络浏览器上呈现页面,然后退出提供该页面的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命令,我会看到控制台日志消息,但是如果我没有注释掉它,则不会呈现页面并且不会输出日志消息。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

当页面已切换到响应流时,将调用res.render()回调,即使它尚未完全传递到客户端。因此,如果您在此时终止进程,则客户端交付可能无法完成。

我可以想出两种方法来解决这个问题:

  1. 为响应流上的close事件创建一个侦听器,当您收到该事件时,您将知道所有内容都已发送,您可以关闭服务器。这将不允许任何其他可能需要加载的页面资源(图像,样式表,字体等等),因为它们可能在页面加载后被请求。

  2. 在页面本身中放置一个ajax调用,以便在页面加载之后,它会进行ajax调用,然后您实际上不会重新启动服务器,直到获得ajax调用。如果您在窗口load事件之前没有进行Ajax调用,那么您还可以确保在重新启动服务器之前已加载所有其他页面资源。

  3. 请注意,这些选项中的任何一个都允许对您的服务器进行各种DOS攻击(导致攻击者想要重启)。