在邮递员中使用表单数据使 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为空。

Req.body 在 node.js 中不可迭代

req.body 在邮递员上运行时说未定义

Node.js、multer 和 req.body 为空

使用 http 时,req.body 为空 。在 angular 和 node.js 中发布

req.body 在帖子上为空