【问题标题】:Express body-parser request.body returning undefinedExpress body-parser request.body 返回 undefined
【发布时间】:2016-02-02 14:40:20
【问题描述】:

当我运行这个应用程序并提交表单“console.log(request.body)”返回未定义。我是 node js 的初学者。谁能解释一下我做错了什么?

这是注册表 注册.jade

doctype html
html
    head
        title.
            Fonebook
        link(rel='stylesheet', href='/assets/bootstrap/css/bootstrap.min.css')
        script(src='https://code.jquery.com/jquery-2.2.0.min.js')
        script(src='/assets/bootstrap/js/bootstrap.min.js')
    body
        div.container
            h3.
                The Fonebook
            form(method="POST",class="center",id="regForm",action='/doReg',enctype="multipart/form-data")
                div.panel.panel-info
                    div.panel-heading.
                        Registration
                    div.panel-body
                        div.col-md-offset-3.col-md-6.col-md-offset-3.form-group
                            label.
                                Profile Picture:
                            input(type='file',name='proPic')
                        div.col-md-offset-3.col-md-6.col-md-offset-3.form-group
                            label.
                                Email:
                            input.form-control(id="email", type="email", name="email", placeholder="Enter email ")
                        div.col-md-offset-3.col-md-6.col-md-offset-3.form-group
                            label.
                                Name:
                            input.form-control(id="name", type="text", name="name", placeholder="Enter name ")
                        div.col-md-offset-3.col-md-6.col-md-offset-3.form-group
                            label.
                                Password:
                            input.form-control(id="password", type="password", name="password")
                        div.col-md-offset-3.col-md-6.col-md-offset-3.form-group
                            a(href='login').
                                Already have an account?
                    div.panel-footer
                        button.btn.btn-info(type="submit").
                            Register

这是我的 app.js 文件

var express = require('express');
var app = express();

var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1/test');

var uploadDir = __dirname + '/uploads';

var fs = require('fs');

var multer = require('multer');

var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());


var conn = mongoose.connection;

app.set('views', './views');
app.set('view engine', 'jade');

app.use('/assets', express.static(__dirname + '/public'));

var port = process.env.PORT || 3000;

app.all('/', function (req, res) {
    res.render('login');

})

app.all('/register', function (req, res) {
    res.render('register');
})

app.all('/login', function (req, res) {
    res.render('login');
})

var storage = multer.diskStorage({
    destination: function (request, file, callback) {
        callback(null, uploadDir);
    },
    filename: function (request, file, callback) {
        //console.log(file);
        callback(null, Date.now() + '.jpg');
    }
});
var upload = multer({storage: storage}).single('proPic');

app.all('/doReg', function (request, response) {
    upload(request, response, function (err) {
        if (err) {
            console.log(err);
            return;
        }
        //console.log(request.file);
        response.end('Your File Uploaded');
    })
    console.log(request.body);
});

app.listen(port);

【问题讨论】:

  • 但是图片上传工作正常!
  • 我不认为body-parser 支持enctype="multipart/form-data"

标签: node.js express body-parser


【解决方案1】:

body-parser 不支持多部分表单。

From their README

这不处理多部分实体,因为它们复杂且通常很大。对于多部分正文,您可能对以下模块感兴趣:

busboy 和 connect-busboy

多方和连接多方

厉害

多工

既然您已经在使用multer,您可以通过这种方式访问​​您的字段:

app.all('/doReg', upload, function (request, response) {
    console.log(request.body);
});

【讨论】:

  • 感谢您的回答。现在我删除了 body-parser ,按照你的方法,但是 console.log(request.body.email);仍然返回 undefined 和 console.log(request.body);返回“{}”空花括号。
  • @ShafayatAlam - 如果您将文件输入移动到表单中的最后一个字段,它会起作用吗?可能与此问题有关:github.com/expressjs/multer/issues/146
  • 我没必要,app.all('/doReg', upload, function (request, response) { console.log(request.body) upload(request, response, function (err) { if (err) { console.log(err); return; } console.log(request.file); response.end('Your File Uploaded'); console.log('Photo Uploaded'); }) });这行得通,但我不知道为什么:p
  • 看起来你在那里调用了两次上传。删除/doReg 之后的那个可能是个好主意,看看它是否仍然有效。
  • 我注意到了,但我使用第二个记录。并且图像已上传一次。所以我认为没有害处?顺便说一句,我在 /doReg .. 上传图片后删除了“上传”,但又没有正文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多