【问题标题】:App.post from EJS form not working - ExpressJS来自 EJS 表单的 App.post 不起作用 - ExpressJS
【发布时间】:2019-11-27 08:02:45
【问题描述】:

我正在使用带有 EJS 作为视图引擎的 express 框架。我在应用程序中有一些基本路线('/' & '/users')。我的 EJS 页面中还有一个表单,我正在使用用户登录。在这里,我有 action="/login" 和 method="POST" 的表单。我在 app.js 中创建了一个处理函数 app.post 来检查凭据并重定向到用户页面。

但是当我点击页面快递应用程序的提交按钮时说“/login”未找到。下面是整个应用程序的目录结构。

menu.ejs:


    <form method="POST" action="/login">
        <input type="text" name="username" placeholder="Username">
        <input type="password" name="password" placeholder="Password">
        <input type="submit" name="login" class="login loginmodal-submit" value="Login">
    </form>

还有 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 session = require('express-session');
var mysql = require('mysql');
var bodyParser = require('body-parser');
var path = require('path');

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

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);
app.use('/login', loginRouter);

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

//express session
app.use(session({
  secret:'secret_key',
  resave:true,
  saveUninitialized:true
}));
app.use(bodyParser.urlencoded({
  extended:true
}));
app.use(bodyParser.json());
mysql
var connection = mysql.createConnection({
  host:'localhost',
  user:'root',
  password:'secret_pw',
  database:'my_db'
});

//login authentication
app.post('/login', function(req,res){
  var username = req.body.username;
  var password = req.body.password;
  if(username && password){ 
      connection.query('SELECT username,password FROM logindetails WHERE username = ? AND password = ?',[username,password], function(error,results,fields){
          if(results.length > 0){
              req.session.loggedin = true;
              req.session.username = username;
              res.redirect('/users');
          } else{
              res.send('Incorrect username and password');
          }
          res.end();
      });
  }
   else{
       res.send('Please enter username and password');
       res.end();
   }
});

module.exports = app;

而登录路径是

var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { page:'home', menuId:'home' });
});



module.exports = router;

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    从 app.js 中省略这段代码

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

    然后将其添加到登录路由器

    router.post('/', function(req, res) {
      /......../
    });
    

    【讨论】:

      【解决方案2】:

      因为你的应用在执行app.post之前到达了下面这个块

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

      将以下块移到app.post下方。

      此外,您应该在初始化路由之前初始化 bodyParsersession

      【讨论】:

      • 谢谢。所以我们总是需要在代码末尾保留错误处理程序。
      猜你喜欢
      • 2022-01-14
      • 2013-12-10
      • 1970-01-01
      • 2012-07-05
      • 2010-12-09
      • 2019-07-31
      • 1970-01-01
      • 2017-11-19
      • 2015-04-29
      相关资源
      最近更新 更多