首页 > 解决方案 > 为什么在 expressjs 中的 POST 请求上清空 req.body?

问题描述

我是expressjs的新手。我正在使用 POST 请求将数据从 Web 表单发送到另一个表单(或在控制台上显示)。但我收到一个空对象。我的路线位于我处理数据的单独文件夹中。我使用 body-parser 作为中间件来处理请求正文。

这是一个简单的网络表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
    <title>Login</title>
</head>
<body>
    <div class="container">
        <div class="jumbotron">
            <h1>Login</h1>
        </div>
        <form method="POST" class="col-md-8" action="/profile">
            <div class="form-group row">
                <div class="col-md-4">
                    <label for="email" class="form-control border-0">Email</label>
                </div>
                <div class="col-md-8">
                    <input type="email" class="form-control" id="email" placeholder="Enter email">
                </div>
            </div>
            <div class="form-group row">
                <div class="col-md-4">
                    <label for="password" class="form-control border-0">Password</label>
                </div>
                <div class="col-md-8">
                    <input type="password" class="form-control" id="password" placeholder="Enter Password">
                </div>
            </div>
            <button type="submit" class="btn btn-primary">Login</button>
        </form>
    </div>
    
</body>
</html>

这是路由文件(route.js)

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');

var jsonParser = bodyParser.json(); // support json encoded bodies
var urlencodedParser = bodyParser.urlencoded({ extended: false }); // support encoded bodies

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index');
});

router.get('/login', (req, res)=>{
  res.render('auth/login');
});

router.post('/profile', urlencodedParser, function(req, res){
  res.send("THank you");
  console.log("called post");
  console.log(req.body);
});

module.exports = router;

这是 app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var bodyParser = require('body-parser');

var jsonParser = bodyParser.json(); // support json encoded bodies

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();



// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});


module.exports = app;

标签: node.jsexpress

解决方案


您需要将name属性放入 HTML<input>标记,例如:

<input name="email" type="email" class="form-control" id="email" placeholder="Enter email">

推荐阅读