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

Node.js 如何修改管道以返回自定义响应?,node.js,request,pipe,Node.js,Request,Pipe,如何使用请求库向客户端返回自定义响应(或错误)?.pipe()始终将原始响应通过管道传回客户端 这将返回原始响应 request(options) .on('error', err => { return cb(err); }) .on('response', response => { // This is an error if (response.statusCode === 500) { const

如何使用
请求
库向客户端返回自定义响应(或错误)?
.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);

是否可以根据响应控制是否对其进行管道传输?

一旦从流中读取数据,该数据将不会被管道传输到其他地方,因此无法读取内容的第一部分,然后决定对整个内容进行管道传输,然后调用
.pipe()
并期望您已经阅读的原始内容在管道响应中

您可能会阅读一些内容,准确地跟踪您所阅读的内容,然后如果您决定只使用管道传输,您可以发送您已经阅读的内容和调用
.pipe()
。你必须自己测试它,看看是否有任何可能导致你丢失一些数据的比赛条件


如果数据不是很大,一件相对容易的事情是读取所有数据(可以在一种模式下使用
request()
library,只需获取所有响应),然后在获得所有数据后,就可以检查数据并决定发送什么。您可以发送原始数据,也可以修改数据并发送修改后的数据,或者您可以决定在其位置发送不同的内容。

一旦您从流中读取数据,该数据将不会被传输到其他地方,因此您无法读取内容的第一部分,然后决定要对整个内容进行管道化,然后调用
.pipe()
,并期望您已经阅读的原始内容在管道化响应中

您可能会阅读一些内容,准确地跟踪您所阅读的内容,然后如果您决定只使用管道传输,您可以发送您已经阅读的内容和调用
.pipe()
。你必须自己测试它,看看是否有任何可能导致你丢失一些数据的比赛条件


如果数据不是很大,一件相对容易的事情是读取所有数据(可以在一种模式下使用
request()
library,只需获取所有响应),然后在获得所有数据后,就可以检查数据并决定发送什么。您可以发送原始数据,也可以对其进行修改并发送修改后的数据,或者您可以决定在其位置发送不同的内容。

请求将在收到响应后立即开始发送。如果要控制管道或不基于收到的状态代码控制管道,则必须在响应回调上进行管道调用,如下所示:

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');
    }
  });

请求将在收到响应后立即启动管道。如果要控制管道或不基于收到的状态代码控制管道,则必须在响应回调上进行管道调用,如下所示:

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');
    }
  });

它给了我一个
错误500,在响应发出数据之后,您不能使用管道。错误:在从响应中发出数据后,您无法进行管道传输。
我刚刚修复了代码,它是
res
(外部响应对象)而不是
response
。这将管道传输您对
res
流的请求响应。请注意,如果您的
cb
回调也向
res
流发送数据,您可能会收到相同的错误。很抱歉,在执行
req.pipe(res)
时发生了错误。它对于
req.pipe(response)
工作正常,除了我们放置了
req.end()。谢谢你的帮助!!!我已将您的答案更新为工作代码。请复习一下,我会把它作为答案。再次感谢@Augusto!它给了我一个
错误500,在响应发出数据之后,您不能使用管道。错误:在从响应中发出数据后,您无法进行管道传输。
我刚刚修复了代码,它是
res
(外部响应对象)而不是
response
。这将管道传输您对
res
流的请求响应。请注意,如果您的
cb
回调也向
res
流发送数据,您可能会收到相同的错误。很抱歉,在执行
req.pipe(res)
时发生了错误。它对于
req.pipe(response)
工作正常,除了我们放置了
req.end()。谢谢你的帮助!!!我已将您的答案更新为工作代码。请复习一下,我会把它作为答案。再次感谢@Augusto!完全有道理!我试图使用
async/await
来收集响应,但它不起作用。。你能帮我举一个简单的例子吗?@JeeMok-和往常一样,我们很难帮助你编写我们看不到的代码,所以要想有机会帮助你编写代码,你必须把它添加到你的问题中,这样我们才能看到你在做什么。完全有道理!我试图使用
async/await
来收集响应,但它不起作用。。你能帮我举一个简单的例子吗?@JeeMok-和往常一样,在我们看不到的代码方面很难提供帮助,所以要想有机会在代码方面帮助你,你必须把它添加到你的问题中,这样我们才能看到你在做什么。