我必须将接收到的文件(字节数组格式)发送到另一个API,它将物理地存储它。到目前为止,我所做的是,我在请求的数据事件中获得了文件的字节数组,并将其添加到数组中,当数据完全获得时,我连接并创建了一个缓冲区,然后简单地将这个缓冲区的数据发送到另一个API,并使用 axios
put方法。
export const putProduct: RequestHandler = async (req: Request, res: Response, next: NextFunction) => {
const chunks: Uint8Array[] = [];
req.on('data', (chunk) => chunks.push(chunk));
req.on('end', async () => {
try {
const data = Buffer.concat(chunks);
const response = await axios.put("REMOTE_API_URL", data);
return res.status(response.status).send(response.data);
} catch (error) {
return res.status(error.response.status).send(error.response.data);
}
});
};
这样做很好,物理文件成功地存储在远程API端点上。
现在这种方法的问题是,它将产生大量的性能开销,因为这些字节块将存储在一个数组中(在内存中),如果文件大小是巨大的,那么它将花费大量的内存来保持它。
我想要的是在一个连续的流中发送单个字节块,因为我们是在请求的数据事件中接收它。我发现 axios
没有这样的支持。建议任何可以做到这一点的库或任何其他可行的方法来解决这种情况将是一个很大的帮助。
先谢谢你
发布我自己的答案,因为它对我来说是有效的。
如果我们接收的是二进制格式的数据,我们可以简单地将请求对象原样传给axios putpost方法。这样就可以解决之前由chunk数组造成的大量内存消耗的问题,因为快递请求对象本身就是一个流,所以不会造成任何内存开销。
export const putProduct: RequestHandler = async (req: Request, res: Response, next: NextFunction) => {
try {
const response = await axios.put("REMOTE_API_URL", req);
return res.status(response.status).send(response.data);
} catch (error) {
return res.status(error.response.status).send(error.response.data);
}
};