Node.js 未捕获的语法错误:意外标记{
我正在尝试编写一个chai测试,我所做的只是流式传输一些音频并得到一个简单的响应:Node.js 未捕获的语法错误:意外标记{,node.js,stream,chai,Node.js,Stream,Chai,我正在尝试编写一个chai测试,我所做的只是流式传输一些音频并得到一个简单的响应:{},出于某种原因,我得到了这个错误未捕获的语法错误:意外的令牌{当我将fs流输送到req时,如果我移除管道,但没有该流,测试工作正常 服务器代码: router.post('/', function (clientRequest, clientResponse) { clientRequest.on('end', function () {//when done streaming audio
{}
,出于某种原因,我得到了这个错误未捕获的语法错误:意外的令牌{
当我将fs
流输送到req
时,如果我移除管道,但没有该流,测试工作正常
服务器代码:
router.post('/', function (clientRequest, clientResponse) {
clientRequest.on('end', function () {//when done streaming audio
console.log('im at the end>>>>>');
clientResponse.setHeader('Content-Type', 'application/json'); //I've tried removing that: same result
clientResponse.json({});
clientResponse.end(); //I've tried removing that: same result
}); //end clientRequest.on('end',)
});
测试代码:
var app = require('./app');
describe('server', function() {
this.timeout(10000);
it('should WORK!!!"', function (done){
var req = chai.request(app).post('/speech');
var readStream = fs.createReadStream('./test.wav');
readStream.on('end',function(){
console.log("readStream end>>>>>>>>>>>>>>>>>>>>>>");
req.end(function (err, res) {
console.log("req.end callback>>>>>>>>>>>>>>>");
done();
});
});
readStream.pipe(req);
});
});
错误:
Uncaught SyntaxError: Unexpected token {
at Object.parse (native)
at _stream_readable.js:908:16
您可以尝试替换此命令
clientResponse.json({});
与
误差分析
代码通常是有效的,问题出在superagent内部的某个地方
实际上,这个问题缺少一些细节,所以我不得不猜测缺少的部分,比如chai.request(app)
是使用来完成的,它反过来又使用来执行http请求
问题似乎出在superagent内部的某个地方,我能够用更多的信息重现您的错误(不确定为什么我得到更长的跟踪):
然后测试通过,但输出“双重回调!”——它也通过了,并确认它出了问题
修复
如果没有http和superagent,做同样的事情并不复杂
首先,服务器端代码。它有一点变化-而不是clientRequest.on('end'),…
我将其传输到写入流。这样,我还可以检查文件是否已实际传输:
var express = require('express');
var fs = require('fs');
var app = express();
module.exports = app;
app.post('/speech', function (clientRequest, clientResponse) {
console.log('speech');
var writeStream = fs.createWriteStream('./test_out.wav');
//for me on('end'... doesn't work (it infinitely waits for event
//probably because the file is small and it finishes before we
//get here
clientRequest.pipe(writeStream).on('finish', function() {
console.log('im at the end>>>>>');
clientResponse.json({'a':'b'});
});
});
app.listen(3000, function() {
console.log("App started");
});
以及测试:
var fs = require('fs');
var chai = require('chai');
var http = require('http');
// Require our application and create a server for it
var app = require('./unexpected');
var server = http.createServer(app);
server.listen(0);
var addr = server.address();
describe('server', function() {
this.timeout(10000);
it('should WORK!!!"', function (done){
// setup read stream
var readStream = fs.createReadStream('./test.wav');
readStream.on('end',function(){
console.log("readStream end>>>>>>>>>>>>>>>>>>>>>>");
});
// setup the request
var request = http.request({
'host': 'localhost',
'port': addr.port,
'path': '/speech',
'method': 'POST'
});
// now pipe the read stream to the request
readStream.pipe(request).on('finish', function() {
console.log("pipe end>>>>>>>>>>>>>>>>>>>>>>");
});
// get the response and finish when we get all the response data
request.on('response', function(response) {
console.log("request end>>>>>>>>>>>>>>>>>>>>>>");
response.on('data', function(data) {
console.log('response data: ' + data);
});
response.on('end', function(data) {
console.log('done!');
done();
});
});
});
});
我认为代码应该是不言自明的,我只是使用标准节点来完成这项工作。如果我没有错,如果你使用
.json(…)
你已经“结束”了响应,所以你不需要clientResponse.end()
没有问题。谢谢您的澄清,这不会改变结果。您能告诉我们哪行代码是908吗?老实说,您显示的代码似乎没有任何意外的{
…它可能在另一个文件中…第90行在_stream_readable.js中,这是一个内部javascript文件,我不知道这对你有多大帮助这是完整的错误消息吗?看起来有一部分被剪切了。你能提供完整的服务器代码吗?特别是主体解析的东西。我试过了,没用,我也试过放Clientreponse.end();在发送之后,也没有帮助var server=http.createServer(app);
这是我一直在寻找的一行,所以你说超级代理有问题,我应该在他们的github上发布问题?@bubakazouba不知怎么地超级代理的请求文本翻了一倍(虽然只有一个对服务器的实际请求)。因此,即使实际问题在http或原始测试代码中,我认为superagent不应该允许这种情况。
var readStream = fs.createReadStream('./test.wav');
readStream.pipe(req);
readStream.on('end',function(){
...
var express = require('express');
var fs = require('fs');
var app = express();
module.exports = app;
app.post('/speech', function (clientRequest, clientResponse) {
console.log('speech');
var writeStream = fs.createWriteStream('./test_out.wav');
//for me on('end'... doesn't work (it infinitely waits for event
//probably because the file is small and it finishes before we
//get here
clientRequest.pipe(writeStream).on('finish', function() {
console.log('im at the end>>>>>');
clientResponse.json({'a':'b'});
});
});
app.listen(3000, function() {
console.log("App started");
});
var fs = require('fs');
var chai = require('chai');
var http = require('http');
// Require our application and create a server for it
var app = require('./unexpected');
var server = http.createServer(app);
server.listen(0);
var addr = server.address();
describe('server', function() {
this.timeout(10000);
it('should WORK!!!"', function (done){
// setup read stream
var readStream = fs.createReadStream('./test.wav');
readStream.on('end',function(){
console.log("readStream end>>>>>>>>>>>>>>>>>>>>>>");
});
// setup the request
var request = http.request({
'host': 'localhost',
'port': addr.port,
'path': '/speech',
'method': 'POST'
});
// now pipe the read stream to the request
readStream.pipe(request).on('finish', function() {
console.log("pipe end>>>>>>>>>>>>>>>>>>>>>>");
});
// get the response and finish when we get all the response data
request.on('response', function(response) {
console.log("request end>>>>>>>>>>>>>>>>>>>>>>");
response.on('data', function(data) {
console.log('response data: ' + data);
});
response.on('end', function(data) {
console.log('done!');
done();
});
});
});
});