Uncaught SyntaxError: Unexpected token {
Uncaught SyntaxError: Unexpected token {
我正在尝试编写一个 chai 测试,我所做的只是流式传输一些音频并得到一个简单的响应:{}
,出于某种原因我收到此错误 Uncaught SyntaxError: Unexpected token {
每当我将我的 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({});
和
clientResponse.send({});
错误分析
一般的代码实际上是有效的,问题出在超级代理内部的某个地方。
实际上问题实际上缺少一些细节,所以我不得不猜测缺少的部分,比如 chai.request(app)
是使用 chai-http, which in turn uses superagent 执行 http 请求完成的。
问题似乎出在超级代理内部的某处,我能够通过更多信息重现您的错误(不确定为什么我得到更长的跟踪):
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)
而且我能够检查 JSON 解析是否尝试解析双重响应。就像如果服务器响应 {}
,解析器有 {}{}
,或者如果服务器响应 {"a":"b"}
,解析器有 {"a":"b"}{"a":"b"}
。
您可以在 this line 之前插入 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(){
...
然后测试通过,但是输出'double callback!'——也是printed by superagent,确认有问题。
修复
没有chai-http
和superagent
做同样的事情并不复杂。
首先是server-side代码。它有点改变 - 而不是 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();
});
});
});
});
我认为代码应该是self-explanatory,我只是使用标准节点http module来完成这项工作。
我正在尝试编写一个 chai 测试,我所做的只是流式传输一些音频并得到一个简单的响应:{}
,出于某种原因我收到此错误 Uncaught SyntaxError: Unexpected token {
每当我将我的 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({});
和
clientResponse.send({});
错误分析
一般的代码实际上是有效的,问题出在超级代理内部的某个地方。
实际上问题实际上缺少一些细节,所以我不得不猜测缺少的部分,比如 chai.request(app)
是使用 chai-http, which in turn uses superagent 执行 http 请求完成的。
问题似乎出在超级代理内部的某处,我能够通过更多信息重现您的错误(不确定为什么我得到更长的跟踪):
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)
而且我能够检查 JSON 解析是否尝试解析双重响应。就像如果服务器响应 {}
,解析器有 {}{}
,或者如果服务器响应 {"a":"b"}
,解析器有 {"a":"b"}{"a":"b"}
。
您可以在 this line 之前插入 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(){
...
然后测试通过,但是输出'double callback!'——也是printed by superagent,确认有问题。
修复
没有chai-http
和superagent
做同样的事情并不复杂。
首先是server-side代码。它有点改变 - 而不是 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();
});
});
});
});
我认为代码应该是self-explanatory,我只是使用标准节点http module来完成这项工作。