Node/Express JS“无法读取未定义的属性‘用户名’" [英] Node/Express JS "Cannot read property 'username' of undefined"

查看:85
本文介绍了Node/Express JS“无法读取未定义的属性‘用户名’"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在您将其标记为重复之前,请了解我所查看的所有答案都与我的代码无关,无法解决该问题.我正在尝试修复 Web 应用程序中的错误,我正在通过该应用程序将文件从 Internet 上传到家庭服务器.我目前正在研究基本的用户身份验证系统.当我尝试在主页上提交登录表单时,我被重定向到一个错误页面,其中部分内容显示无法读取未定义的属性‘用户名’".此消息也出现在控制台中.发生了什么,我该如何解决?该错误将我引导至家庭控制器的第 8 行,username = req.body.username".应用程序

Before you mark this as a duplicate, please understand that none of the answers I have looked at pertain enough to my code to fix the issue. I am trying to fix an error in a web app that I am making to upload files to a home server from the internet. I am currently working on the basic user authentication system. When I try to submit the login form on the home page, I am redirected to a page with an error, part of which says "Cannot read property 'username' of undefined". This message also appears in console. What is happening and how can I fix it? The error directs me to line eight of the home controller, "username = req.body.username". App.js

var LocalStrategy = require('passport-local').Strategy;
var flash = require("connect-flash");
var passport = require("passport");
var session = require("express-session");
var expressValidator = require("express-validator");
var mongoose = require("mongoose");
var path = require('path');
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
var bodyParser = require('body-parser');
var ejs = require('ejs');
var routes = require('./server/routes');   
routes(app);
app.set('port', process.env.PORT || 3000);
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(cookieParser());
mongoose.connect("mongodb://localhost:27017/users");
app.listen(app.get('port'), function(){
  console.log("server started");
});
var db = mongoose.connection;
app.use(session({
  secret: 'yVVma9ga',
  saveUninitialized: true,
  resave: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));
app.use(flash());
app.use(function(req,res,next) {
  res.locals.success_msg = req.flash('success_msg');
  res.locals.error_msg = req.flash('error_msg');
  res.locals.error = req.flash("error");
  next();
});

/server/routes.js

/server/routes.js

var express = require("express");
var home = require('../controllers/home');
var client = require('../controllers/client');
module.exports = function(app) {
    var router = express.Router();
    app.use('/', router);
    router.get('/', home.index);
    router.get('/client', client.home);
    router.post('/', home.login);
}

控制器/home.js

controllers/home.js

module.exports = {
    index: function(req, res){
        res.render("home");
    },
    login: function(req, res){
        var username = req.body.username;
        var password = req.body.password;
        req.checkBody('username', 'Username is required').notEmpty();
        req.checkBody('password', 'Password is required').notEmpty();
        var errors = req.validationErrors();
        if(errors){
            console.log("YES");
        }else{
            console.log("NO");
        };       
    }
}

/views/home.ejs(部分只是基本的html)

/views/home.ejs (partials are just basic html)

<% include partials/header %>
<p>Welcome to your personal server!</p>
<p>Login!</p>
<form method="post" action = "/">
<input placeholder="Username" type="text" name="username">
<input placeholder="Password" type="password" name="password">
<input type="submit" value="Submit">
</form>
<% include partials/footer %>

推荐答案

我敢打赌,您对路由的调用发生在 app.use 调用 bodyparser 之前.尝试将您的路线移动到它们下方.

My bet is that your call to routes is happening before your app.use is calling bodyparser. Try moving your routes below them.

改变

var routes = require('./server/routes');   
routes(app);
//...
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

var routes = require('./server/routes');
//...
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
//...
routes(app);

这篇关于Node/Express JS“无法读取未定义的属性‘用户名’"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆