2017-07-30 23 views
0

問題/問題req.body爲空{}後點的申請表格後

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); 
} 

passwordChange功能

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; 
} 
+0

未定義'req.body'幾乎總是由聲明'body-parser'中間件時聲明_before_的請求處理程序(用於'POST/changePassword')引起的。 – robertklep

+0

你可以給你的密碼變更功能!? –

+0

@robertklep我不明白爲什麼在幾個其他頁面後,這個問題剛剛出現。我包括我的app.js和index.js代碼的一部分。請在底部查看我的補充內容。 – badinvestor

回答

0

這聽起來像問題是,形式不被在JSON發送。默認情況下,html表單是以urlencoded(您指定的)發送的。除非您發送通過JavaScript的形式,並指定JSON你應該使用bodyParser.urlencoded

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

我很困惑到其他形式如何做同樣都在工作。如果你使用類似jQuery的東西通過腳本發送它們(而不是使用native html),那麼表單仍然可以通過json發送。

+0

如果你不確定你不應該發佈你的答案。 –

+0

但是,我同意你的觀點,可能是這個問題,但其他apis是如何工作的? –

+0

@Froast謝謝你的帖子,雖然這並沒有解決我的問題 – badinvestor