9

I have two nodeJS servers, Server 1 gets requests from the client and passes it to server 2 which returns a response to server 1 and it responds to the client. The client uploads a file and it has to be passed the same way as any other rest request that I have.

I use axios on server 1 to send the data to server2 and multer on server 2 to store the file on disk.

I have an issue sending the request from server1 to server2 because the body of the request contains nothing and the request is Multipart. enter image description here

How should I handle the request on Server 1 ???

router.post('/fileUpload', (req, res) => {
    console.log(req.body);
    res.status(200).json({ msg: "Got file" });
});
Pini Cheyni
  • 5,073
  • 2
  • 40
  • 58

2 Answers2

25

You can use form-data module to send multipart/form-data from nodejs application

Here is the code you can implement on Server1 to receive image file from client and send it to Server2.

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

Here multer is used to handle the uploaded file

Apar Adhikari
  • 741
  • 1
  • 6
  • 17
  • 1
    Very helpful! For conciseness, use: await axios.post('http://server2url/fileUploadToServer2', form, { headers: form.getHeaders() }) – MiKK Dec 27 '21 at 00:46
1
 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])
        }

you can append your query variables and file to formData and pass formData to body

  • I'm having an issue sending the `res.file` using **FormData** it sends a request but without the file, Is there any practical example on how to accomplish it? I was able to send file after reading it from the disk on the server1 using **fs.createReadStream** – Pini Cheyni Oct 25 '18 at 11:33
  • if you able to read file from disk,then append that file to formData – Nandkishor Shinde Oct 26 '18 at 07:20