将文件从一个节点js服务器发送到另一个

时间:2018-08-09 11:26:25

标签: node.js express multipartform-data multer

所以在第一台服务器上,我的路由是这样的:

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

在此服务器上,它工作正常,我可以看到 req.file 及其缓冲区。因此,我想将此文件(不存储在第一台服务器上,仅存在于内存中并作为缓冲区)发送给另一个。

其他服务器路由如下:

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

因此,在第二台服务器上,它甚至没有进入multer中间件,始终定义了req.file,并且从未看到console.log('entered here?')。看起来我没有以多部分形式传递数据?

第二台服务器也可以通过邮递员直接向其发送文件。

所以我的问题是,如何发送该文件?作为缓冲区?流? Base64?我想我已经尝试了所有方法,甚至将 node-fetch 更改为 request ,但还是没有运气。

3 个答案:

答案 0 :(得分:1)

因此,在第二台服务器上,它甚至都没有进入multer中间件,始终定义了req.file,并且从未看到console.log('enter here here?')。好像我没有以多部分形式传递数据?

所以这意味着您的第二台服务器不理解请求的Content-Type。

在将请求发送到第二台服务器时,做一件事在标头中添加 Content-Type 参数

Content-Type 添加到多部分/表单数据 或者,如果您不知道通行标题:{     'Content-Type':未定义    } http将为您设置标题

答案 1 :(得分:0)

您将请求发送到/usershttp://localhost:3003/users),而第二台服务器希望在/上请求。

尝试更改任何一个以匹配另一个。

答案 2 :(得分:0)

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