【问题标题】:NodeJS express Post form - action always 404NodeJS express Post 表单 - 动作总是 404
【发布时间】:2016-03-23 22:43:46
【问题描述】:

无论我在表单的操作中声明什么链接,它总是返回 404 错误。如果我改变获取方法,它不会。 我想使用 post,因为我试图从我的输入字段中获取数据并将其发布到我的 mongedb 数据库中:

HTML:

<form class="container-fluid searchContainer" action="/active" method="post">
    <div class="col-xs-6">
        <div class="form-group">
            <label for="businessUnit">Business unit</label>
            <input type="text" ng-model="businessUnit" id="businessUnit" name="businessUnit" class="form-control"/>
        </div>
        <div class="form-group">
            <label for="tenderId">Tender ID</label>
            <input type="text" name="tenderID" ng-model="tenderId" id="tenderId" class="form-control"/>
        </div>
    </div>
    <div class="col-xs-6">
        <div class="form-group">
            <label for="tenderDate">Tender Bidding Date</label>
            <input type="date" ng-model="tenderDate" name="tenderDate" id="tenderDate" class="form-control"/>
        </div>
        <div class="form-group">
            <label for="therapyArea">Therapy area</label>
            <input type="text" ng-model="therapyArea" name="therapyArea" id="therapyArea" class="form-control"/>
        </div>

    </div>
    <div class="col-md-12 text-right">
        <input type="submit" id="btnCreate" value="Create" class="btn btn-primary" >
    </div>
</form>

JAVASCRIPT:

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 active = require('./routes/active');



var app = express();

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

// 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('/', routes);
app.use('/users', users);
app.use('/active', active);


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


var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/tenders');

var db = mongoose.connection;

db.on('error', function(err) {
    console.log('connection error', err);
});
db.once('open', function() {
    console.log('connected.');
});


var Schema = new mongoose.Schema({
    TenderID: String,
    TenderDate: String,
    BusinessUnit: String,
    TherapyUnit: String
});



var Tender = mongoose.model('Tender', Schema);


app.post('/active', function(req, res) {

    new Tender({
        TenderID: req.body.tenderID,
        TenderDate: req.body.tenderDate,
        BusinessUnit: req.body.businessunit,
        TherapyUnit: req.body.therapyUnit
    }).save(function(err, doc) {
        if (err) res.json(err);
        else res.send('Succesfully insterted')

    })

});

【问题讨论】:

  • 你能把./routes/active的内容贴出来吗?

标签: javascript node.js post express action


【解决方案1】:

因为在定义 app.post('/active') 之前定义了 404 路由处理程序,所以 express 首先评估 404 规则并返回它。您的 POST /active 路线永远不会被评估。要解决此问题,您需要在您的 404 路线(应该始终是您的最后一条路线)之前为 Express 提供您的 POST /active 路线。

除非您在文件 ./routes/active 中定义了等效的 POST /active 路由,否则该行

app.use('/active', active);

即使在您的 404 路由之前对其进行评估,也无法解决此问题。您可以阅读更多关于 app.use()app.get|post|etc() in the express docs 的信息。

Express 按照规则通过use()get|post|delete|etc() 传递给它的顺序评估规则

【讨论】:

  • 这很好用!但是发布后如何查看视图?现在我从 res.send 中看到“已成功插入”,我如何才能看到活动视图?
  • @SanderVanKeer 您当前发送回浏览器的唯一内容是“成功插入”。因此,您需要发回一个完整的 html 页面 (res.sendFile) 或呈现一个模板(类似jade 的东西可以工作)。如果您不希望您的表单提交将您带到一个新页面,您需要使用AJAX techniques 编写一些客户端javascript。
  • 我刚刚使用了 res.redirect() 但感谢您的帮助,您真的帮助了我!
【解决方案2】:

您已经在服务器中定义了get 路由。尝试改变

app.get('/active',function(req,res){

进入

app.post('/active',function(req,res){

这样,您将响应来自浏览器的发布请求。

【讨论】:

  • 我在问题中编辑了它,它仍然给出了同样的问题
  • 我看到你也有一条路线app.use('/active', active);你可以尝试重命名其中一个吗?
猜你喜欢
  • 2019-01-05
  • 2016-02-25
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多