【问题标题】:req.body is empty { } after form post in node application节点应用程序中的表单发布后 req.body 为空 { }
【发布时间】:2017-07-30 14:59:22
【问题描述】:

问题/问题

当我发布表单数据时,我的req.body 未定义...这很奇怪,因为我有多个其他页面的表单,我以相同的方式发布数据,但突然之间我遇到了这个问题,我不知道为什么。这似乎是一个常见问题,但我找不到适合我的修复方法。

到目前为止我所尝试的...

代码

<form action="/changePassword" method="post" onsubmit="event.stopPropagation(); return passwordChange(this);" enctype="application/x-www-form-urlencoded" novalidate="">
    <input id="password1" placeholder="password" name="password1" maxlength="30" class="form-control input-sm chat-input" type="password">
    <input id="password2" placeholder="confirm password" name="password2" maxlength="30" class="form-control input-sm chat-input" type="password">
    <input id="changePassword" value="Change Password" type="submit">
</form>

app.post('/changePassword', users.changePassword);

module.exports.changePassword = function(req, res){
    console.log(req.is('json')); // false and req.body is undefined
    ...
    ...        
    res.redirect('/'); 
});

如果需要额外的代码,请告诉我。

编辑:不确定这是否值得一提,但我遇到了其他问题,而其他页面也没有这些问题。当我尝试验证密码时,return false; 不会阻止页面发布/执行。我必须包括event.stopPropagation()

附加代码:

./bin/www

!/usr/bin/env 节点

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('app:server');
var http = require('http');
var express= require('express');

/**
 * Get port from environment and store in Express.
 */

var port = parseInt(process.env.PORT, 10) || 3000;

app.set('port', port);

/**
 * Create HTTP server.
 */

// var server = http.createServer(app);

//var server = app;

/**
 * Listen on provided port, on all network interfaces.
 */

app.use((err, req, res, next) => {
  console.log(err.stack || err.message);
  if (res.headersSent)
    return next(err)
  res.status(500).send('Internal Server Error')
})

app.listen(port);
app.on('error', onError);
app.on('listening', onListening);

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error('Port ' + port + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error('Port ' + port + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  debug('Listening on port ' + server.address().port);
}

app.js

/*jslint node:true */
/*global $, jQuery, alert*/
"use strict";
var express = require('express');
var path = require('path');
var fs = require('fs');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var expressSession = require('express-session');
var mongoose = require('mongoose');
var mongoStore = require('connect-mongo/es5')({ session: expressSession });
var passport = require('passport');
var debug = require('debug')('app:server');
var uriUtil = require('mongodb-uri');
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;

var assert = require('assert');


mongoose.Promise = global.Promise;

var MONGOLAB_URI = ****;
var mongooseUri = uriUtil.formatMongoose(MONGOLAB_URI);
var mongoConnection = mongoose.connect(MONGOLAB_URI, function (err, db) {
    if (err) {
        console.log('Unable to connect to MongoDB: ', err);

    } else {
        console.log('Connection has been established...');        
    }
});

var app = express();

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

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}))


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

console.log("__dirname: " + __dirname);

app.use(expressSession({
    secret: 'RCNEfyBUAcHnPeQxFWyBTr',
    cookie: { maxAge: 60*60*1000 },
    resave: true,
    saveUninitialized: true
}));


app.use(passport.initialize());
app.use(passport.session());

require('./routes/index')(app, conn);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

module.exports = app;
exports.mongoConnection = mongoConnection;

index.js

module.exports = function (app, conn) {
    ... 

    app.post('/signup', users.signup);
    app.post('/login', users.login)
    app.post('/changePassword', users.changePassword);                         
    app.post('/password', users.password); // send new password
    app.post('/user/create_test', users.create_test);
    app.post('/user/calculatesubjects', users.calculate_subjects);
    app.post('/user/calculatetopics', users.calculate_topics);
    app.post('/test/:username/:testid/:noq/:quesnum', users.answer_selected);

    // Admin posts
    app.post('/admin/update_subjects_topics', admin.update_subjects_topics);
    app.post('/admin/add_question', admin.add_question);
}

密码修改功能

function passwordChange(form) 
{
    if(form.password1.value != "" && form.password1.value == form.password2.value) {
      if(form.password1.value.length < 6) {
        alert("Error: Password must contain at least six characters!");
        form.password1.focus();
        return false;
      }

      re = /[a-z]/;
      if(!re.test(form.password1.value)) {
        alert("Error: password must contain at least one lowercase letter (a-z)!");
        form.password2.focus();
        return false;
      }
    } else {
      alert("Error: Please check that you've entered and confirmed your password!");
      form.password2.focus();
      return false;
    }

    return true;
}

【问题讨论】:

  • req.body 未定义几乎总是由在声明body-parser 中间件之前声明请求处理程序(对于POST /changePassword)引起的。
  • 可以给你的passwordChange函数吗!?
  • @robertklep 我不明白为什么在其他几页之后才出现这个问题。我包括了我的 app.js 和 index.js 代码的一部分。请在底部查看我的补充。
  • @badinvestor 您在哪里(以及如何)在app.js 中加载和使用index.js
  • 感谢他的快速回复。我包括了 ./bin/www,app.js 的第一部分。索引最后被调用...

标签: javascript json node.js


【解决方案1】:

听起来问题是表单不是以 JSON 格式发送的。默认情况下,html 表单作为 urlencoded(您指定)发送。除非您通过 javascript 发送表单并指定 json,否则您应该使用 bodyParser.urlencoded:

var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded());

我对其他类似形式的工作方式感到困惑。如果您使用 jQuery 之类的东西通过脚本(而不是原生 html)发送表单,仍然可以通过 json 发送表单。

【讨论】:

  • 如果你不确定你不应该发布你的答案。
  • 但是我同意你的看法,这可能是这个问题,但是其他 api 是如何工作的?
  • @Froast 谢谢你的帖子,虽然这并没有解决我的问题
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 2014-08-31
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多