我有以下restify处理程序:
var assert = require('assert-plus');
var request = require('request');
function postParseVideo(req, res, next) {
assert.string(req.body.videoSourceUrl, 'videoSourceUrl');
var stream = request.get({uri: req.body.videoSorceUrl});
stream.on('response', function(parseResponse) {
fnThatTakesAReadableStream(parseResponse, function(err, data) {
if (err) {
console.log(err);
next(err);
} else {
res.send(201, null, {Location: data.location});
next();
}
});
});
stream.on('error', function(err) {
console.log(err);
next(err);
});
};
当我运行它时,都没有调用任何流事件处理程序。相反,错误会冒充到restify服务器:{"code":"InternalError","message":"options.uri is a required argument"}
。我查看了请求v2.54.0的源代码,看起来该错误消息必须来自restify.js的406行,其中包含:
return self.emit('error', new Error('options.uri is a required argument'))
我已经成功地使用了许多其他语言的流,但我不熟悉在JavaScript中使用它们。在我看来,request.get
正在抛出一个同步错误,当它应该发出一个错误'事件。有什么我从根本上误解了如何在Node中实现流?
答案 0 :(得分:1)
您的req.body.videoSourceUrl
可能已定义且类型为string
,但它可能为空。
我可以通过执行以下操作重现您的错误:
request.get("")
.on('response', function(){
})
.on('error', function(){
})
我也考虑转储assert-plus
,如:
var ass = require('assert-plus');
ass.string(new String("yes"), "no");
引发