javascript - 将多部分请求从一个 GraphQL API 转发到另一个 GraphQL API
问题描述
我正在通过多部分请求将文件从浏览器上传到由 express 提供支持的 graphql-yoga 支持的 GraphQL-API。现在我想将这个完全相同的请求正文转发到另一个 GraphQL-API。
const fetch = require('node-fetch');
async passThrough(args, opts) {
const { body, getRawBody, headers, method } = opts.request;
var rawBody;
if (body.files && body.files.length) {
rawBody = await getRawBody;
} else {
rawBody = typeof body == 'string' ? body : JSON.stringify(body)
}
let options = {
body: rawBody,
method, headers
};
var res = await fetch(otherApiUrl, options).then((res) => {
return res.json();
});
return res;
}
在这个函数中,我将身体作为一个对象。但它包括“文件”作为我不能简单转发的承诺(找不到任何事情要做)。因此,我尝试通过快速中间件获取原始正文,并像上面一样使用await getRawBody访问它。
function getRawBody(req, res, next) {
req.getRawBody = new Promise(resolve => {
var buf = '';
req.on('data', x => buf += x);
req.on('end', () => {
resolve(buf);
});
});
next();
}
server.express.use(getRawBody);
它将请求传递给其他 API,但文件不再是有效的 jpeg。我发现,上传的文件从原始文件中移动了一些位。我可能做错了什么?
解决方案
我在这里找到了一个解决方案并调整了函数来获取原始身体。现在文件内容不再在目标主机上移动。
const concatStream = require('concat-stream');
function getRawBody(req, res, next) {
req.getRawBody = new Promise(resolve => {
req.pipe(concatStream(function (data) {
resolve(data);
}));
});
next();
}
推荐阅读
- javascript - 使用 Angular6 在 3 个元素之间切换类
- javascript - 如何将箭头功能更改为常规功能?
- python - 将多个工作簿中的数据复制并自动化到现有的主工作簿中,而不会丢失使用 python 的格式
- sql - 拆分具有分隔值的列并比较每个值
- reactjs - 我对组件生命周期方法声明中的此错误 Typo 感到震惊 react/no-typos
- c# - 在构建期间找出 PlatformNotSupportedException
- scala - 在 akka http 客户端中禁用 SSL 安全性
- angular - 如何在我的联系人列表中使用无限滚动
- webpack - 带有 webpack 5 的工作箱不生成预缓存清单
- python - 未来化我的 Python 代码是否会使其依赖于未来的模块。?