Node.js 未捕获的语法错误:意外标记{

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

我正在尝试编写一个chai测试,我所做的只是流式传输一些音频并得到一个简单的响应:
{}
,出于某种原因,我得到了这个错误
未捕获的语法错误:意外的令牌{
当我将
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();
            });
        });
    });
});