当发送套接字的分支进程失败时,我找不到如何正确处理这种情况的方法。
以下是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)
在给定的情况下,是否可以在分叉进程中处理未捕获的异常,并在主体中生成带有状态代码和错误描述的友好响应?
我尝试过的:
- 在
server.js
中订阅了子级的close
事件,并从那里发送了响应,但运气不佳-抛出了This socket is closed.
- 在抛出错误之前,在
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');
}