使用套接字优雅地处理分叉进程中未捕获的异常



当发送套接字的分支进程失败时,我找不到如何正确处理这种情况的方法。

以下是server.js:的示例

'use strict';
var http = require('http');
var fork = require('child_process').fork;
var srv = http.createServer(function (req, res) {
  var f = fork('./client.js');
  f.send('socket', res.socket);
});
srv.listen(7331, 'localhost', function () {
  console.log('server started');
  var req = http.request({
    port: 7331,
    path: '/'
  }, function (res) {
    res.setEncoding('utf8');
    var body = '';
    res.on('data', function (chunk) {
      body += chunk;
    });
    res.on('end', function () {
      console.log('RESPONSE', res.statusCode, res.headers, body);
    });
  });
  req.on('error', function (e) {
    console.log('REQUEST ERROR', e.stack);
  });
  req.end();
});

client.js:

throw new Error('Client error');

我得到以下输出:

    server started
client.js:1
(function (exports, require, module, __filename, __dirname) { throw new Error('Client Error');
                                                              ^
Error: Client Error
    at Object.<anonymous> (client.js:1:69)
    at Module._compile (module.js:425:26)
    at Object.Module._extensions..js (module.js:432:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:457:10)
    at startup (node.js:136:18)
    at node.js:972:3
REQUEST ERROR Error: socket hang up
    at createHangUpError (_http_client.js:209:15)
    at Socket.socketOnEnd (_http_client.js:294:23)
    at emitNone (events.js:72:20)
    at Socket.emit (events.js:166:7)
    at endReadableNT (_stream_readable.js:905:12)
    at doNTCallback2 (node.js:450:9)
    at process._tickCallback (node.js:364:17)

在给定的情况下,是否可以在分叉进程中处理未捕获的异常,并在主体中生成带有状态代码和错误描述的友好响应?

我尝试过的:

  1. server.js中订阅了子级的close事件,并从那里发送了响应,但运气不佳-抛出了This socket is closed.
  2. 在抛出错误之前,在client.js中做了一些准备:订阅了uncaughtException并向套接字发送了一些响应数据-仍然是socket hang up,没有响应

由于这里没有活动,我在nodejs repo中发布了这个问题https://github.com/nodejs/node/issues/4745,在那里它得到了nodejs贡献者的关注。

综上所述:在发送给子进程的父进程中使用套接字是不可能的,因为一旦调用send(),套接字就会被销毁。

因此,解决问题的唯一方法是在出现错误之前在client.js中做一些准备。我在第2次尝试中指出我这样做了,但也许我做错了。。。使用以下client.js代码,一切都很好:

'use strict';
let socket;
process.on('uncaughtException', function (e) {
  socket.write(`HTTP/1.1 500 OKnContent-Type: text/htmlnContent-Length: ${e.message.length}nn${e.message}`);
});
process.on('message', function (type, s) {
  socket = s;
  routine();
});

function routine() {
  throw new Error('Client error');
}

相关内容

  • 没有找到相关文章

最新更新