未捕获的SyntaxError:意外的标记{

我试图写一个柴testing,我所做的只是stream一些audio,并得到一个简单的回应: {} ,出于某种原因,我得到这个错误Uncaught SyntaxError: Unexpected token {当我pipe我的fsstream到req ,如果我删除pipe道,我没有那个streamtesting工作正常。

服务器代码:

 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',) }); 

testing代码:

 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 

错误分析

一般的代码实际上是有效的,问题是在超级服务器内部的某个地方。

其实问题实际上是缺less一些细节,所以我不得不猜猜丢失的部分,就像chai.request(app)使用chai-http完成的 ,而chai-http又使用superagent来执行http请求。

而问题似乎是在superagent里面的某个地方,我能够用更多的信息重现你的错误(不知道为什么我得到了更多的信息):

 Uncaught SyntaxError: Unexpected token { at Object.parse (native) at IncomingMessage.<anonymous> (/project/path/node_modules/chai-http/node_modules/superagent/lib/node/parsers/json.js:9:2 at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13) 

而且我能够检查JSONparsing试图parsing双重响应。 如果服务器响应{} ,parsing器具有{}{} ,或者服务器响应{"a":"b"} ,则parsing器具有{"a":"b"}{"a":"b"} 。 你可以在这行之前插入console.log(res.text) (本地文件位于node_modules / chai-http / node_modules / superagent下)来检查。

另外如果我移动readStream.pipe(req); 就在var readStream

 var readStream = fs.createReadStream('./test.wav'); readStream.pipe(req); readStream.on('end',function(){ ... 

然后testing通过,但输出“双重callback! – 它也是由superagent打印,并确认出现了问题。

修复

没有chai-httpsuperagent ,做同样的事情并不复杂。

首先是服务器端的代码。 它改变了一点 – 而不是clientRequest.on('end', ...我把它pipe到写入stream。这样我也可以检查文件实际上是传输:

 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"); }); 

和testing:

 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(); }); }); }); }); 

我认为代码应该是不言自明的,我只是使用标准节点http模块来完成这项工作。

你可以尝试replace这个命令

 clientResponse.json({}); 

 clientResponse.send({});