未捕获的SyntaxError:意外的标记{
我试图写一个柴testing,我所做的只是stream一些audio,并得到一个简单的回应: {}
,出于某种原因,我得到这个错误Uncaught SyntaxError: Unexpected token {
当我pipe我的fs
stream到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-http
和superagent
,做同样的事情并不复杂。
首先是服务器端的代码。 它改变了一点 – 而不是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({});
- 用Mocha和Chai在JavaScript中testing一个随机数函数
- nodejs – stub module.exports函数与sinon
- 节点摩卡柴asynchronous – 一切都传递,即使它应该失败
- AssertionError:expected {Object(__flags)}有属性'_id'
- unit testingExpress Middleware的正确方法
- 向Chai / Mocha提供应包含的部分密钥列表
- 摩卡忽略了一些testing,尽pipe它们应该运行
- mongoose模式unit testing失败与前保存挂钩
- Chaivariables不是由Karma / Grunt加载的