我是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}
]
}
答案 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.');
});