chai-http写完后

我有一个server-app ,从客户端接收audiostream。 我正在尝试使用chai / chai-http来testing应用程序,但它给了我这个错误:

[错误:结束后写入]

有什么问题?

码:

 var chai = require('chai'); var chaiHttp = require('chai-http'); var server = require('../server-app'); var should = chai.should(); var fs = require('fs'); chai.use(chaiHttp); describe('server', function() { it('should work..', function (done){ var req = chai.request(server).post('/speech'); fs.createReadStream('./test.wav').pipe(req); req.end(function (err,res){ console.log(err);//outputs: [Error: write after end] done(); }); }); }); 

您在stream完成向请求推送数据之前调用了req.end

我会做以下几点:

 var readstream = fs.createReadStream('./test.wav'); readstream.pipe(req); readstream.on('close', someFunction); readstream.on('end', someFunction); 

并在stream的closeend事件中调用req.end 。 在这些事件发出之前,你正在调用req.end。

基本上JavaScript是asynchronous和stream或套接字连接是synchronus,一旦你创build一个stream,你必须等待streamclosures,以提出另一个请求

在你的情况下,req.end在你打开stream之后得到执行

三个选项可以使它成为工作

  1. 尝试与柴代理
  2. 把你的代码放到stream中,因为chai.end和stream end对于你的场景来说似乎是一样的
  3. 把req.end里面setTimeOut(没有尝试可能是最糟糕的情况)

当pipe道默认情况下,当源stream发出'end'事件时,在目标上调用end() 。 所以你不必自己调用end()

logging目标stream的'finish''error'事件,以控制何时完成工作或何时发生错误:

  fs.createReadStream('./test.wav').pipe(req); req.on('error', (err) => {console.log(err);}); req.on('finish',() => {done();}); 

如果你想保持writer( req )打开,你可以在pipe道设置end option为false:

fs.createReadStream('./test.wav').pipe(req, options = {end = false}); 但请记住,“完成”事件不会被pipe道激发。