Как передать многокомпонентный запрос с одного сервера на другой в NodeJS? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть два сервера nodeJS, Сервер 1 получает запросы от клиента и передает их серверу 2, который возвращает ответ серверу 1, и он отвечает клиенту.Клиент загружает файл, и он должен быть передан так же, как и любой другой запрос на отдых, который у меня есть.

Я использую axios на сервере 1 для отправки данных на сервер2 и multer на сервере 2 для сохранения файла на диске.

У меня проблема с отправкой запроса с server1 на server2, потому что тело запроса ничего не содержит и запрос Multipart .enter image description here

Как мне обработать запрос на сервере 1 ???

router.post('/fileUpload', (req, res) => {
    console.log(req.body);
    res.status(200).json({ msg: "Got file" });
});

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вы можете использовать модуль form-data для отправки multipart / form-data из приложения nodejs

Вот код, который вы можете реализовать на сервере Server1 для получения файла изображения от клиента и отправки его на сервер 2.

const express = require("express");
const app = express();
const bodyParser = require('body-parser');
var multer  = require('multer')();
const FormData = require('form-data');
const axios = require('axios');
const fs = require('fs');

app.use(bodyParser.json());

app.post('/fileUpload' , multer.single('fileFieldName'), (req , res) => {
    const fileRecievedFromClient = req.file; //File Object sent in 'fileFieldName' field in multipart/form-data
    console.log(req.file)

    let form = new FormData();
    form.append('fileFieldName', fileRecievedFromClient.buffer, fileRecievedFromClient.originalname);

    axios.post('http://server2url/fileUploadToServer2', form, {
            headers: {
                'Content-Type': `multipart/form-data; boundary=${form._boundary}`
            }
        }).then((responseFromServer2) => {
            res.send("SUCCESS")
        }).catch((err) => {
            res.send("ERROR")
        })
})

const server = app.listen(3000, function () {
    console.log('Server listening on port 3000');
});

Здесь multer используется для обработки загруженного файла

0 голосов
/ 11 мая 2019

@ Apar Adhikari, ваше решение абсолютно работает, но я думаю, что мы должны использовать дисковое хранилище в multer вместо буфера.Потому что, если мы используем буферное хранилище, ОЗУ на сервере 1 вскоре будет перегружено при большом количестве запросов.Есть еще одна проблема: если запрос от сервера 1 к серверу 2 занимает много времени, запрос от браузера к серверу 1 будет превышен.Поэтому я думаю, что мы должны немедленно передать данные из нескольких частей с сервера 1 на сервер 2, не сохраняя их на сервере 1 временно (как на дисковом хранилище, так и в буфере), или, если возможно, мы должны отправить файл напрямую на сервер 2.

0 голосов
/ 25 октября 2018
 const formData = new FormData();
 formData.append('query', updateDocQuery);
 formData.append('variables', JSON.stringify(this.setUpdateDocParams() || {}));
 for (let i = 0; i < fileArr.length; i++) {
            formData.append(`file${i}`, fileArr[i])
        }

вы можете добавить переменные и файл запроса в formData и передать formData в тело

...