如何修改管道以返回自定义响应?

时间:2018-07-18 02:28:04

标签: node.js request pipe

如何使用request库将自定义响应(或错误)返回给客户端? .pipe()将始终通过管道将原始响应发送回客户端

这将返回原始响应

request(options)
    .on('error', err => {
      return cb(err);
    })
    .on('response', response => {
      // This is an error
      if (response.statusCode === 500) {
        const error = new Error('File not found');
        return cb(error);
      }
      return cb(null, response, 'application/pdf');
    })
    .pipe(res);

这将返回我的自定义响应

request(options)
    .on('error', err => {
      return cb(err);
    })
    .on('response', response => {
      // This is an error
      if (response.statusCode === 500) {
        const error = new Error('File not found');
        return cb(error);
      }
      return cb(null, response, 'application/pdf');
    });
    // .pipe(res);

是否可以根据响应控制是否通过管道传输?

2 个答案:

答案 0 :(得分:2)

一旦您从流中读取了数据,该数据就不会在其他地方传输了,因此您无法读取内容的第一部分,然后决定要传输整个内容,然后调用{{1 }},并希望您已经阅读的原始内容包含在管道响应中。

您也许可以阅读一些内容,准确跟踪所阅读的内容,然后,如果您决定仅通过管道传输内容,则可以发送已阅读的内容并致电.pipe()。您必须自己进行测试,以查看是否存在可能导致您丢失一些数据的比赛条件。

如果数据不是很大,那么一个相对容易的事情就是读取所有数据(.pipe()库可以在一种模式下使用,它只会为您获得所有响应),然后一次您拥有所有数据,就可以检查数据并确定要发送的内容。您既可以发送原始数据,也可以对其进行修改并发送修改后的数据,或者可以决定在其位置发送其他内容。

答案 1 :(得分:1)

该请求将在收到响应后立即开始管道传输。如果您想根据收到的状态码控制管道,或不控制管道,则必须在响应回调上进行管道调用,如下所示:

const req = request(options)
  .on('error', err => cb(err))
  .on('response', response => {
    // This is an error
    if (response.statusCode === 500) {
      const error = new Error('File not found');
      return cb(error);
    }

    if (typeof response.end === 'function') {
      req.pipe(response);
    }
    if (response.req.finished) {
      return cb(null, response, 'application/pdf');
    }
  });