【问题标题】:nodejs error 404 on post (not via url)帖子上的nodejs错误404(不是通过url)
【发布时间】:2016-06-10 00:54:37
【问题描述】:

每当我尝试从索引提交时,都会出错。 我试图从用户名和密码输入中获取值。

这应该是处理帖子的代码:

app.post('/', function(req, res){
  var username=req.body.username;
  var password=req.body.password;
  res.render("the username and password you posted:" +password+username);
  });

我的 app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var patienten = require('./routes/patienten');
var form = require('./routes/form');

var app = express();

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

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());

app.use('/', routes);
app.use('/users', users);
app.use('/patienten', patienten);
app.use('/form', form);

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

app.get("/", function(req, res) {
  res.send("i am from /get");
});

app.get("/", function(req, res){
  res.sendfile("/");
});
app.post('/', function(req, res){
  var username=req.body.username;
  var password=req.body.password;
  res.render("the username and password you posted:" +password+username);
});

// 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;

form.js

var express = require('express');
var router = express.Router();
var mysqlModel = require('mysql-model');
var request = require('request');
var ejs = require('querystring');

/* GET home page. */
router.get('/form', function(req, res) {
    res.render('form', {
        title: 'EPD - Login',
    });
});

module.exports = router;

form.ejs(提交页面)

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <form  action="/" method="GET">
<input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" name="submit" value="gogo">
    </form>
  </body>
</html>

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    这个用于处理 404 的中间件应该放在最后一条路由之后。 否则根据您的代码,您的所有点击都将返回 404

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

    此外,您的表单应该发送 POST 请求而不是 GET

    <form  action="/" method="POST">
    

    此外,res.render 用于渲染视图。您可以根据需要使用 res.send 或 res.json。

    app.post('/', function(req, res){
      var username=req.body.username;
      var password=req.body.password;
      res.send("the username and password you posted:" +password+username);
    });
    

    【讨论】:

      【解决方案2】:

      您不会使用res.render() 定期回复客户。请改用res.send()。这就是您收到错误的原因。 res.render() 用于 Express 中的视图引擎,并将渲染的视图模板发送回客户端。 IE ejs 在这种情况下是定义的视图引擎,这就是下面的代码正在做的事情

      // view engine setup
      // Tells express to render from the views directory
      app.set('views', path.join(__dirname, 'views')); 
      app.set('view engine', 'ejs');
      

      您的 404 处理程序应该是您的 express 主文件中倒数第二个路由,因为它是任何与您定义的路由不匹配的路由 因为 Express 自上而下通过路线。随着您的 404 处理程序被定义在您的 Express 应用程序中的错误位置,您应该检查可能与您的路线发生冲突。

      您有以下路由器中间件

      app.use('/', routes);

      然后是下面的 GET 路由

      app.get("/", function(req, res) {
        res.send("i am from /get");
      });
      

      根据routes 文件的内容,可能会发生冲突,app.get() 将永远不会被执行。

      你应该如下设置你的路线:

      app.use('/', routes);
      app.use('/users', users);
      app.use('/patienten', patienten);
      app.use('/form', form);
      
      // If you have a GET inside your 'routes' file
      // from above, then this may never get called if 
      // it also contains a route for GET '/'
      app.get("/", function(req, res) {
        console.log('I am from get');
        return res.render('index');
      });
      
      
      // My comment from above about your GET '/' would
      // also apply to this POST route 
      app.post('/', function(req, res){
        var username=req.body.username;
        var password=req.body.password;
        return res.status(200).send("the username and password you posted: " + password + ' ' + username);
      });
      
      // catch 404 and forward to error handler
      app.use(function(req, res, next) {
        var err = new Error('Not Found');
        err.status = 404;
        return next(err);
      });
      
      // development error handler
      // will print stacktrace
      if (app.get('env') === 'development') {
        app.use(function(err, req, res, next) {
          res.status(err.status || 500);
          return 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);
        return res.render('error', {
          message: err.message,
          error: {}
        });
      });
      

      您还需要将您在form.ejs 文件中指定的HTTP MethodGET 更改为POST

      &lt;form action="/" method="POST"&gt;

      【讨论】:

      • 非常感谢,你救了我! :_)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2017-07-03
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多