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的close或end事件中调用req.end
。 在这些事件发出之前,你正在调用req.end。
基本上JavaScript是asynchronous和stream或套接字连接是synchronus,一旦你创build一个stream,你必须等待streamclosures,以提出另一个请求
在你的情况下,req.end在你打开stream之后得到执行
三个选项可以使它成为工作
- 尝试与柴代理
- 把你的代码放到stream中,因为chai.end和stream end对于你的场景来说似乎是一样的
- 把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道激发。