[英]Node.js, multer and req.body empty
这是我的问题,我有一个可以插入文件和字段的表单,但我只收到文件而不收到参数test
? 为什么?
这是我的代码:
应用程序.js:
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var port = 8000;
var multer = require('multer'); // v1.0.5
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './uploads');
},
filename: function (req, file, callback) {
callback(null, file.originalname.substring(0,file.originalname.lastIndexOf('.')) + '-' + Date.now() + file.originalname.substring(file.originalname.lastIndexOf('.'),file.originalname.length));
}
});
var upload = multer({ storage : storage}).single('fileUpload');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.post('/api/upload',function(req,res){
console.log(req.body);
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
});
});
app.listen(port, function () {
console.log('Express server inizializzato sulla porta ' + port);
});
索引.html:
<html>
<head>
<title>Test upload</title>
</head>
<body>
<form name="form" action="http://localhost:8000/api/upload" method="post" enctype="multipart/form-data">
<input type="text" name="test" />
<input type="file" name="fileUpload" />
<input type="submit" value="invia" />
</form>
</body>
</html>
有人可以帮助我吗?
2017年更新
请注意, req.body 可能尚未完全填充。 这取决于客户端向服务器传输字段和文件的顺序。
我通过在前端颠倒表单对象属性的顺序解决了我的问题:
var newFormObj = new FormData();
newFormObj.append('internalUserID', internalUserID);
newFormObj.append('listingImage', this.binaryImages[image]);
在后端:
var storage = multer.diskStorage({
destination: function (req, file, cb) {
console.log(req.body.internalUserID) // YAY, IT'S POPULATED
cb(null, 'listing-pics/')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
});
var upload = multer({ storage: storage });
我在 post 函数的末尾解决了移动req.body
的问题:
app.post('/api/upload?:test',function(req,res){
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
console.log(req.body);
});
});
如果有人能告诉我为什么我会很乐意学习新事物! 但是,现在,我解决了!
将您的console.log(req.body)
upload(req,res,function(err) {...})
默认的 express body-parser 不能与 multipart/form-data 一起使用,因此我们使用 multer 来解析可以在上传函数中访问的表单数据。
万一其他人带着像下面这样稍微复杂的初始布局来到这里,将上传功能移动到每个路由的文件中并在那里使用它们似乎已经为我解决了这个问题。 为什么会这样喜怒无常,我不知道,老实说,这让我很头疼。
应该注意的是,我有一个自定义存储引擎将文件流式传输到磁盘,这可能导致了这个问题,但它只发生在 1 个特定路由上,该路由在功能上与其他几个完美运行的路由相同。
希望有一天这可以帮助其他人。
import express from 'express';
import multer from 'multer';
import profilePicture from './routes/profile-picture.ts';
const upload = multer();
class Server {
constructor() {
this.app = express()
}
setRoutes() {
this.app.use( '/upload', upload.single( 'profile' ), profilePicture );
}
// ... other methods
}
import { Router } from 'express';
const profilePicture = Router();
profilePicture.post( '/', ( req, res, next ) => {
console.log( req.body ); // This was always empty, regardless of field order
// do something with req
}
import express from 'express';
import profilePicture from './routes/profile-picture.ts';
class Server {
constructor() {
this.app = express()
}
setRoutes() {
this.app.use( '/upload', profilePicture );
}
// ... other methods
}
import { Router } from 'express';
import multer from 'multer';
const upload = multer();
const profilePicture = Router();
profilePicture.post( '/', upload.single( 'profile' ), ( req, res, next ) => {
console.log( req.body ); // No longer empty, hooray!
// do something with req
}
您可以使用 javascript 手动重新排序字段,以确保在文件之前发送字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.