Sending file from one node js server to another

≯℡__Kan透↙ 提交于 2021-01-05 12:01:47

问题


So on first server I have route like this:

const express = require('express');
const router = express.Router();
const FormData = require('form-data');
const fetch = require('node-fetch');
const multer = require('multer');
const storage = multer.memoryStorage();
const upload = multer({ storage });

router.post('/', upload.single('file'), async (req, res) => {

    const form = new FormData();

    form.append('folderId', req.body.folderId);
    form.append('file', req.file.buffer, req.file.filename);

    const result = await fetch('http://localhost:3003/users', { method: 'POST', body: form }).then(res => res.json());
    res.json(result);
})

On this server, it works fine, I can see req.file and it's buffer. So I wanna send this file (without storing it on first server, it exists only in memory and as buffer) to another.

Other server route is like this:

const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require('path');
const putanja = path.join(__dirname, '../uploads/users');
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        console.log('entered here?')
        if (!req.body.folderId) return cb({ message: 'no folderId' });
        if (!fs.existsSync(putanja + '/' + folderId)) fs.mkdirSync(putanja + '/' + folderId);
        cb(null, putanja + '/' + folderId);
    },
    filename: (req, file, cb) => cb(null, file.originalname)
});
const upload = multer({ storage });
const fs = require('fs');


router.post('/', upload.single('file'), async (req, res) => {
    console.log(req.body)
    console.log(req.file)
    res.json({ status: 'ok' })
})

So on second server, it doesn't even enter the multer middleware, req.file is always defined, and that console.log('entered here?') is never seen. Looks like I'm not passing data as multipart-form?

Also, second server, when sending file directly to it via postman, works.

So my question, how do I send that file? As a buffer? Stream? Base64? I think I tried everything, even changed node-fetch to request, but still no luck.


回答1:


So on second server, it doesn't even enter the multer middleware, req.file is always defined, and that console.log('entered here?') is never seen. Looks like I'm not passing data as multipart-form?

So this mean your second server doesn't understand the Content-Type of request.

So do one thing add Content-Type parameter in header when you are sending request to second server

Add Content-Type to multipart/form-data or if you don't know pass headers : { 'Content-Type' : undefined } http will set header for you




回答2:


You send your request to /users (http://localhost:3003/users) yet your second server expects the request on /.

Try changing either one to match the other.




回答3:


'use strict';

const express   = require('express');
const multer= require('multer');
const concat = require('concat-stream');
const request = require('request');

const router = express.Router();

function HttpRelay (opts) {}


HttpRelay.prototype._handleFile = function _handleFile (req, file, cb) {
    console.log('hell0 proto');
    file.stream.pipe(concat({ encoding: 'buffer' }, function (data) {
        const r = request.post('/Endpoint you want to upload file', function (err, resp, body) {

            if (err) return cb(err);
            req.relayresponse=body;
            cb(null, {});
        });

        const form = r.form();
        form.append('uploaded_file', data, {
            filename: file.originalname,
            contentType: file.mimetype
        });
    }))
};

HttpRelay.prototype._removeFile = function _removeFile (req, file, cb) {
    console.log('hello');
    cb(null);
};

const relayUpload = multer({ storage: new HttpRelay() }).any();

router.post('/uploadMsgFile', function(req, res) {
    relayUpload(req, res, function(err) {

        res.send(req.relayresponse);

    });
});

module.exports = router;


来源:https://stackoverflow.com/questions/51765755/sending-file-from-one-node-js-server-to-another

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!