将文件从一个Node.js服务器发送到另一个服务器

3

首先,在第一个服务器上,我有这样一个路由:

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?')从未被看到。看起来我没有将数据作为multipart-form传递?此外,通过postman直接向第二个服务器发送文件时可以工作。所以我的问题是,我该如何发送该文件?作为缓冲区?流?Base64?我认为我尝试了所有可能,甚至将node-fetch更改为request,但仍然没有运气。

你找到解决问题的方法了吗?我也遇到了同样的问题。 - Rijo
3个回答

1
在第二个服务器上,它甚至没有进入multer中间件,req.file总是被定义,而且那个console.log('entered here?')从未出现。看起来我没有将数据传递为multipart-form?这意味着您的第二个服务器不理解请求的Content-Type。所以做一件事,在发送请求到第二个服务器时,在头部添加Content-Type参数。将Content-Type添加到multipart/form-data中,或者如果您不知道如何传递标头:{'Content-Type':undefined},http会为您设置标头。

1
很好的发现,但是还是不起作用 :( 首先我尝试设置头部为:headers: { 'Content-Type': 'multipart/form-data' },但这不起作用,因为node-fetch会出现错误:FetchError: invalid json response body。然后我发现我可以使用form.getHeaders(),这样可以通过,但仍然无法激活multer中间件。 - Wolfdog
@Wolfdog 你的评论是正确的。 - Rijo

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;

0

你向 /users (http://localhost:3003/users) 发送了请求,但是你的第二个服务器期望在 / 上接收请求。

尝试更改其中一个以匹配另一个。


不是这样的,当我需要路由器时,我已经预先添加了“/users”。我从第一个访问的路由是正确的。 - Wolfdog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接