我有一个服务,接收带有文件和json数据的发布请求。我在app.js中使用body-parser包。我想将文件发送到" filer"服务,并从中处理答案,但我不想管道请求,因为我也需要处理json内容并在文件管理器应答后进行一些操作。
const Busboy = require('busboy');
const request = require('request');
const sendFile = (req, file, callback) => {
return request.post({
uri: 'http://localhost:5000/stream',
headers: req.headers,
formData: { value: file }
}, (err, resp, body) => {
if (err) return callback(err);
return callback();
});
};
app.post('/route', (req, res, next) {
const busboy = new Busboy({ headers: req.headers });
busboy.on('file', (fieldName, file) => {
file.on('error', err => reject(err));
return sendFile(req, file, (err, link) => {
file.resume();
if (err) return reject(err);
});
});
busboy.on('field', (fieldName, val) => {
// process the json here...
});
busboy.on('finish', () => {
console.log('busboy.on(finish)');
return next();
});
req.pipe(busboy);
}
文件管理器服务如下:
app.post('/stream', (req, res, next) => {
const busboy = new Busboy({ headers: req.headers });
// here we are ok
busboy.on('file', function (fieldName, file, name) {
// but this part never run
res.send(200, { fileId: fileDoc._id });
});
return req.pipe(busboy);
});
不幸的是,文件管理器服务永远不会回答,我也不知道,缺少的部分在哪里。试图将file.resume()
放在busboy.on('file')
内的某些地方,但没有帮助。
答案 0 :(得分:0)
这可能是因为来自busboy的文件流永远不会被请求formData正确处理。
另一种方式是:
fs.createWriteStream
)fs.createReadStream
)next()
这样,如果需要或者将文件发送到其他服务,您甚至可以在主服务中使用该文件。