当我发送请求时表达http服务器它会把这个错误抛给我

时间:2017-10-02 06:22:34

标签: javascript node.js express

我是node.js的新手,我想做的是从node.js调用java程序然后将数据返回给客户端。

_http_outgoing.js:636
nextTick(msg.socket[async_id_symbol],
                   ^

TypeError: Cannot read property 'Symbol(asyncId)' of null
at write_ (_http_outgoing.js:636:24)
at ServerResponse.write (_http_outgoing.js:630:10)
at Socket.<anonymous> (/Users/Yiming/Sites/chartingProjectNode/http-server.js:18:13)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at addChunk (_stream_readable.js:252:12)
at readableAddChunk (_stream_readable.js:239:11)
at Socket.Readable.push (_stream_readable.js:197:10)
at Pipe.onread (net.js:588:20)

http-server.js中的代码

var express = require('express');
var app = express();

app.use('/JS',express.static(__dirname + '/JS'));
app.use('/CSS',express.static(__dirname + '/CSS'));
app.use('/', express.static(__dirname + '/'));

app.get('/', function (req, res) {
    res.sendFile("/index.html");
}).listen(8080);

app.get('/toJSON', function(req, res, next) {
    var files = req.query.files;
    var spawn = require('child_process').spawn;
    var child = spawn('java',  ['-cp', 'CSVExtractor.jar:.', 'toJSON.ToJSON', files]);
// prc.stdout.setEncoding('utf8');
    child.stdout.on('data', function (data) {
        res.write(data);
        res.end();
    });
    child.stderr.on('data', function (data) {
        process.stderr.write(data);
    });

});

javascript中的代码:

$.get("http://localhost:8080/toJSON?files=" + fileNames.join(), 
    function (d){
        console.log(d);
    }
);

我将文件名发送到http-server.js,然后调用java程序然后使用输出作为数据。

它只能运行一次,然后它会抛出这个错误。 第一次输出:

{
"nodes":[
{"name" : "123", "group": 1, "inner_radius": 0},
{"name" : "456", "group": 2, "inner_radius": 2},
{"name" : "789", "group": 3, "inner_radius": 1}
],
"links":[
{"source": 0, "target": 1},
{"source": 0, "target": 2},
{"source": 1, "target": 0},
{"source": 2, "target": 0}
]
}

2 个答案:

答案 0 :(得分:0)

data事件可以多次触发,但是您在第一个事件之后结束响应。相反,当流上的end事件触发时结束响应:

child.stdout.on('data', function (data) {
    res.write(data);
}).on('end', function() {
    res.end();
});

(添加error事件处理程序)

也是一个好主意

答案 1 :(得分:0)

看起来,基于callstack中的内容,套接字由于res.end()而关闭,然后msg.socket[async_id_symbol]被调用,但套接字不再打开。

TypeError: Cannot read property 'Symbol(asyncId)' of null
at write_ (_http_outgoing.js:636:24)

您可以尝试发表评论res.end();,看看它是否继续有效。

https://nodejs.org/api/child_process.html#child_process_subprocess_stdout

childprocess.stdout是一个可读的流,因此res.end()可能会将其删除。

这看起来也很有帮助:

事件:'结束'# 当没有更多数据要从流中消耗时,会发出'end'事件。

注意:除非数据被完全消耗,否则不会发出'end'事件。这可以通过将流切换到流动模式,或者重复调用stream.read()直到所有数据都被消耗来完成。

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
});

readable.on('end', () => {
  console.log('There will be no more data.');
});