【发布时间】:2015-05-03 08:37:16
【问题描述】:
我有这个基本的快递应用:
var express = require('express');
var app = express();
var PORT = 3000;
var through = require('through');
function write(buf) {
console.log('writing...');
this.queue('okkkk');
}
function end() {
this.queue(null);
}
var str = through(write, end);
/* routes */
app.get('/', function(req, res){
res.send("Hello!");
})
app.post('/stream', function(req, res){
var s = req.pipe(str).pipe(res);
s.on('finish', function() {
console.log('all writes are now complete.'); // printed the first time
});
});
/* listen */
app.listen(PORT, function () {
console.log('listening on port ' + PORT + '...');
});
当我在启动服务器后第一次向/stream 端点发布一些数据时 我得到okkk 作为我所期望的响应。但是,在那之后,对/stream 端点的任何请求都会超时并且不会返回任何响应。
为什么会这样?这里到底发生了什么?
【问题讨论】:
-
您正在通过管道发送请求,但您仍然必须通过响应来回答请求,或者至少以
res.end()结束它,否则它会一直保持打开状态,直到超时。 -
只有当我明确地调用
.write()时才需要end()吗?无论如何我都试过了,现在有了它,我得到了一个空洞的回应。另外,如果我需要.end(),为什么在启动服务器后第一次工作? -
嗯,由于某种原因,响应没有完成并且一直保持打开状态,我不知道为什么,我以前从未见过有人通过管道发送请求,可能就是这样。跨度>
-
嗯,请求是一个可读流,所以我认为你当然可以通过管道传输它。
-
你可以管道它,但你必须结束它,你必须发送响应并关闭所有内容,否则它会一直处于不确定状态,我只是不知道在管道时如何执行此操作整个请求,也许其他人会这样做?