所以在第一台服务器上,我的路由是这样的:
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 ,但还是没有运气。
答案 0 :(得分:1)
因此,在第二台服务器上,它甚至都没有进入multer中间件,始终定义了req.file,并且从未看到console.log('enter here here?')。好像我没有以多部分形式传递数据?
所以这意味着您的第二台服务器不理解请求的Content-Type。
在将请求发送到第二台服务器时,做一件事在标头中添加 Content-Type 参数
将 Content-Type 添加到多部分/表单数据 或者,如果您不知道通行标题:{ 'Content-Type':未定义 } http将为您设置标题
答案 1 :(得分:0)
您将请求发送到/users
(http://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;