javascript - 将 Node.js 请求包装到 Promise 和管道中

标签 javascript node.js promise request

这是我的场景: 我想使用 request 获取一些外部资源(二进制文件)库并将其通过管道传输到我自己的应用程序的客户端。如果响应代码是 != 200 或者到达远程服务器时出现问题,我想拦截并提供自定义错误消息。理想情况下,如果响应良好,我希望保留原始 header 。

我能够通过下面粘贴的第一段代码来实现这一目标。但是,我的整个应用程序基于 Promise API,因此我希望使其保持一致并将其包装在 Promise 中。当我这样做时,它就不再起作用了。首先,我尝试使用 request-promise 来实现这一目标。 , 没有成功。然后我尝试自己准备一个非常简单的例子,仍然没有成功。

工作示例

var r = request.get('http://foo.bar');
r.on('response', result => {
  if (result.statusCode === 200) {
    r.pipe(res);
  } else {
    res.status(500).send('custom error message')
  }
});
r.on('error', error => res.status(500).send('custom error message');

不起作用的示例

var r;
return new Promise((resolve, reject) => {
  r = request.get('http://foo.bar');
  r.on('response', result => {
    if (result.statusCode === 200) {
      resolve();
    } else {
      reject()
    }
  });
  r.on('error', reject);
}).then(() => {
  r.pipe(res);
}).catch(() => {
  res.status(500).json('custom error message');
});

我所说的“不工作”是指 - 未提供任何响应,请求正在等待超时。

我已更改代码,以在传递给 resolve 的结果上调用 .pipe(),而不是 r。它响应客户端,但响应为空。

最后,我尝试用 http.get() 替换 request lib。这样,服务器将文件返回给客户端,但缺少 header (例如 Content-TypeContent-Length)。

我用谷歌搜索了很多,尝试了几个请求版本......但没有任何效果。

最佳答案

问题是,当触发 "response" 时,您创建一个立即解析的新 Promise,但是 then 回调始终异步执行,并且当它被调用时,文件已到达服务器,并且不再有数据流经流。相反,您可以只使用回调的 body 参数:

request.get('http://foo.bar', function(request, response, body) {
  if(response.statusCode === 200) {
    res.end(body);
  } else {
    res.status(500).end();
  }
});

对于处理流request似乎有点问题,axios似乎做得更好:

axios.get("http://foo.bar"', {
  validateStatus: status => status === 200,
  responseType: "stream"
}).then(({data: stream}) => {
  stream.pipe(res);
}).catch(error => {
   res.status(500).json(error);
});

关于javascript - 将 Node.js 请求包装到 Promise 和管道中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090164/

相关文章:

JavaScript style.display ="none"或 jQuery .hide() 效率更高?

javascript - react CSS 转换不触发

javascript - 我如何在 mongoOp 查找查询之外的 Node js 中打印结果数组?

javascript - 调用异步函数内部有更多的异步函数

sqlite - WinJS SQLite runAsync all 在做其他事情之前

javascript - 捕获完整 Canvas 图像

javascript - require 函数在 Promise 中不起作用

javascript - 如何使用 v8 native 插件将 C++ 数组传送到 node.js

javascript - 执行 promise 后代码不会中断

javascript - 如果在特定网页上运行脚本