在邮递员中使用表单数据使 req.body 为空
Posted
技术标签:
【中文标题】在邮递员中使用表单数据使 req.body 为空【英文标题】:Getting req.body empty using form-data in postman 【发布时间】:2020-08-26 05:43:33 【问题描述】:当我通过这样的表单数据使用postman
发布请求时,我的 express js 中有空对象:
var storage = multer.diskStorage(
destination: function (request, file, callback)
callback(null, 'public/images/course');
,
filename: function (request, file, callback)
console.log(req.file)
if (request.files)
console.log(file)
// TODO: consider adding file type extension
fileExtension = file.originalname.split('.')[1]
return callback(null, `$request.path-$request.files[0]._id.toString().$fileExtension`);
// fallback to the original name if you don't have a book attached to the request yet.
return callback(null, file.originalname)
);
var uploadImg = multer(storage : storage).single('thumbnail')
router.post('/course', async(req, res) =>
console.log(req.body) // console logs empty object
try
const course = new Course(
name : req.body.name,
thumbnail : 'placeholder'
)
uploadImg(req, res, function (err)
if (err)
console.log(err.message);
// An error occurred when uploading
return
console.log('Everything went fine');
// Everything went fine
)
catch(e)
res.status().send()
)
之前我不能使用 multer 来解析数据,因为首先我想通过 mongoose 生成一个 id,然后我像上面一样使用 multer。
例如,我不能这样做:
router.post('/course', upload.single(), async(req, res) =>
console.log(req.body) // console logs empty object
try
const course = new Course(
name : req.body.name,
thumbnail : 'placeholder'
)
uploadImg(req, res, function (err)
if (err)
console.log(err.message);
// An error occurred when uploading
return
console.log('Everything went fine');
// Everything went fine
)
catch(e)
res.status().send()
)
它给出了一个错误:意外字段。
那么有什么方法可以先获取我的 req.body 数据,这样我就可以生成我的 mongoose id 然后上传图片
//index.js
const express = require('express')
var multer = require('multer');
require('./db/mongoose')
const userRouter = require('./routers/user')
const taskRouter = require('./routers/task')
const courseRouter = require('./routers/course')
var bodyParser = require('body-parser');
const app = express()
const port = process.env.PORT || 3000
// // for parsing application/json
app.use(bodyParser.json())
app.use(bodyParser.urlencoded( extended: true ));
app.use(express.json())
app.use(express.static('public'))
app.use(userRouter)
app.use(taskRouter)
app.use(courseRouter)
app.listen(port, () =>
console.log('connected succefully')
)
【问题讨论】:
你能添加你的主应用文件吗,我想看看你正在使用的模块。也许它与body-parser
lib 有关。
这里是@Danizavtz
【参考方案1】:
如果您使用的是express
版本>= 4.16
您肯定可以删除 body-parser
库。
您也可以从 package.json 中删除
express `4.16 的新功能之一是带有 body-parser 的 bundle express。
如果是这种情况,请删除带有 body-parser lib 的行,并仅使用与 express 捆绑在一起的 body parser:
app.use(express.json());
app.use(express.urlencoded( extended: true ));
如果是 版本 还要在你的 package.json 中安装 body-parser
const bodyparser = require('body-parser')
...
app.use(bodyparser.json())
app.use(bodyparser.urlencoded(extended: true))
你应该坚持使用一种,但不要混合使用。
【讨论】:
是的,首先我只使用 expess 解析器,但仍然得到空对象。没有帮助 您的multer
声明在哪里处理文件?您可以从邮递员中删除文件并再次进行测试吗?
看到我用我的 multer 声明更新了帖子,我尝试再次测试但没有解决@Danizavtz【参考方案2】:
在最新版本的使用表单数据发送请求的express中,您需要在服务器端添加multer
。像这样:
npm install --save multer
然后在您的主服务器文件中添加这些行。
const multer = require('multer');
const upload = multer();
app.use(upload.array());
【讨论】:
【参考方案3】:使用express-busboy 解析邮递员表单数据。
var app = express();
var expressBusboy = require('express-busboy');
expressBusboy.extend(app);
【讨论】:
以上是关于在邮递员中使用表单数据使 req.body 为空的主要内容,如果未能解决你的问题,请参考以下文章
使用Express node.js的post表单接收req.body为空。