为什么没有调用我的流错误处理程序

Why is my stream error handler not being called?

本文关键字:错误 处理 程序 我的 调用 为什么      更新时间:2023-09-26

我有以下 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 中实现流,我有什么根本性的误解吗?

您的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");

抛出