在某些情况下,当在我的节点/express服务器上遇到特定路由时,我希望向API发出请求,并将响应直接返回给客户端。我遵循了这篇堆栈溢出帖子:Send response from server side axios request to React/Redux app
要创建此文件,请执行以下操作:
router.use('/', async (req, res) => {
const apiUrl = `https://assets.scratch.mit.edu${req.url}`;
console.log(apiUrl);
const scratchResponse = await axios.get(apiUrl);
try {
res.send(scratchResponse);
console.log('worked!', apiUrl);
} catch (error) {
console.log('error in assets get request', apiUrl, error);
res.sendStatus(500);
}
});
这对于一些请求是有效的,但对于其他请求是中断的,并出现错误:
TypeError: Converting circular structure to JSON
根据这篇堆栈溢出帖子的建议:JSON.stringify, avoid TypeError: Converting circular structure to JSON
我尝试通过添加以下导入来使用npm flatted
库:
const { stringify } = require('flatted/cjs');
在我的回复之前,我会把它串起来:
res.send(stringify(scratchResponse));
但似乎一些对客户端至关重要的信息正在被删除(客户端中断并说它缺少属性)。
是否可以直接发送我从API接收到的响应?
发布于 2019-03-03 19:23:55
好吧,最简单的方法可能是通过管道将响应传递给客户端:
router.get('/', (req, res) => {
axios({
method: 'get',
url: apiUrl,
responseType: 'stream'
})
.then(function(response) {
response.data.pipe(res)
});
});
如果第三方的格式有问题,您还是不走运,但这至少会让您的服务器端处理不再是问题,而且性能应该会更好一些,因为您只是通过管道传输响应,而不是在服务器上获得完整的响应,然后将其序列化为JSON,然后重新发送到响应流。
https://stackoverflow.com/questions/54972716
复制相似问题