Как отправить полученный файл байтового массива в непрерывном потоке другому API в NodeJS? - PullRequest
0 голосов
/ 23 апреля 2020

Я должен отправить полученный файл (в формате байтового массива) другому API, который будет хранить его физически. Что я сделал до сих пор, так это то, что я получил файловые байтовые чанки по событию data запроса и добавил его в массив чанков, а когда данные были получены полностью, я объединил и создал буфер, а затем просто отправил эти данные буфера в другой 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.

Теперь проблема с этим подходом заключается в том, что он создаст огромный Снижение производительности, так как эти чанки будут храниться в массиве (в памяти), а если размер файла огромен, то для его хранения потребуется достаточно много памяти.

Я хочу отправить отдельного человека куски байтов в непрерывном потоке, поскольку мы получаем его по событию data запроса. Я обнаружил, что axios не имеет такой поддержки. Предложение о любой библиотеке, которая может сделать это или любой другой подход, который будет иметь возможность решить эту ситуацию, будет большой помощью.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 мая 2020

Публикация моего собственного ответа, как он работал для меня.

Мы можем просто передать объект запроса, как он есть, к методу ax ios put / post, если мы получаем данные в двоичном формате. Это обеспечит решение проблемы огромного потребления памяти, которое было вызвано массивом чанков ранее, так как объект запроса express сам по себе является потоком, который не будет вызывать никаких накладных расходов памяти.

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