Загрузка файла через прокси с узлом / express. js и запрос узла приводят к поврежденным файлам с почти двукратным размером файла - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь прокси нашего основного сервера через сервер node.js / express. js. У меня все работает как надо, кроме загрузки файлов. Файлы загружаются и достигают сервера, однако где-то между данными, передаваемыми в запрос node.js, и данными, поступающими на сервер, файл поврежден.

Файл с длиной содержимого 1833 в конечном итоге имеет содержимое длина 3274, как только он достигает сервера. Я ожидаю, что файл, который достигает сервера, останется в 1833. Работа без прокси работает как ожидалось.

Это конечная точка POST прокси

router.post("*", wrapAsync(async (req: any, res: any) => {
    const path = ROOT_PATH + req.originalUrl;
    logger.info("Proxy request to: POST " + path);
    const headers = JSON.parse(JSON.stringify(req.headers)); // create a copy of headers
    delete headers["content-length"]; // Without this node.js requests will set the content-length to null
    if (req.session.auth) {
        headers.Authorization = req.session.auth.Token;
    }
    const options = {
        agentOptions,
        body: req.rawBody,
        encoding: null as any,
        headers,
        json: false,
        resolveWithFullResponse: true,
        url: path
    };
    const result = await request.post(options);
    handleJSONResponse(result, res);
}));

Значение для req.rawBody создано в следующем небольшом промежуточном программном обеспечении:

app.use("/rest/api", (req: any, res, next) => {
    // This is a special piece of proxy middleware that provides the raw buffer
    req.rawBody = "";
    req.setEncoding("utf8");
    req.on("data", (chunk: any) => {
        req.rawBody += chunk;
    });
    req.on("end", () => {
        next();
    });
}, proxyRouter);

Это либо что-то в промежуточном программном обеспечении, либо что-то в запросе node.js (либо ошибка, либо что-то в том, как я его настроил), которое, кажется, вызывает проблему , Для меня возможно обрабатывать файлы в отдельной конечной точке, пока она получает POST: ed к той же конечной точке на сервере (ie, это не должно быть напрямую прокси, у меня есть контроль, какие URL использует интерфейс )

1 Ответ

0 голосов
/ 05 февраля 2020

Проблема была в промежуточном программном обеспечении

(req: any, res, next) => {
    // This is a special piece of proxy middleware that provides the raw buffer
    req.rawBody = "";
    req.setEncoding("utf8");
    req.on("data", (chunk: any) => {
        req.rawBody += chunk;
    });
    req.on("end", () => {
        next();
    });
}

Решена с помощью взамен bodyParser.raw (), ie:

app.use("/rest/api", bodyParsers.raw(), proxyRouter);
...