【问题标题】:Node.js/Express - Routing More Than One Form PostNode.js/Express - 路由多个表单帖子
【发布时间】:2016-08-01 22:42:24
【问题描述】:

我正在处理具有两个单独表单的网页,其中包含两个单独的表单操作。我可以让一种表格工作,但我不能让两种表格都工作。我有发布路由 router.post('/direct-user',...) 和发布路由 router.post('/other-user', ...),如果我将其中一个更改为 router.post('/',...) 那么它就可以了。

我怀疑我的 app.js 路由声明有问题,但我想不通。

任何指导都会非常棒。

我的应用结构如下所示:

/project
    /routes
        index.js
        requser.js
    /views
        error.hbs
        index.hbs
        layout.hbs
        requser.hbs
    app.js
    package.json

这是我的主应用程序文件,其中包含我的模块导入、路由位置和错误处理。 app.js

// Module imports //
var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var morgan = require('morgan');
var path = require('path');
var app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(validator());
app.use(express.static(path.join(__dirname, 'public')));


// Routes and views //
app.use('/', require('./routes/index'));
app.use('/user/:id', require('./routes/user'));
app.use('/user-update', require('./routes/user'));
app.use('/requser', require('./routes/requser'));
app.use('/direct-user', require('./routes/requser'));
app.use('/other-user', require('./routes/requser'));


// Catch 404 and forward to error handler //
app.use(function(req, res, next) {
        var err = new Error('Not Found');
        err.status = 404;
        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);
                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;

这是我的 requser 文件,其中包括一个用于加载空表单的 get 路由,以及两个用于处理来自两种表单之一的输入的 post 路由。 requser.js

// Module imports //
var express = require('express');
var router = express.Router();


// GET request user form //
router.get('/', function(req, res, next) {
    res.render('requser', {
        title: 'User Request'
    });
});


// POST /direct-user //
router.post('/direct-user', function(req, res) {
    // Validate form contents
    // ...

    // Assuming all is well
    console.log('Direct user requested');
    res.send('cool');
});

// POST other-user //
router.post('/other-user', function(req, res) {
    // Validate form contents
    // ...

    // Assuming all is well
    console.log('Other user requested');
    res.send('cool');
});

module.exports = router;

最后,我的表单视图/模板。 requser.hbs

<div class="container">
<h1>User Request</h1>

<!-- Start of direct user creation form //////////////////////////////// -->
<form method="post" action="/direct-user">
    <!-- First name, last name -->
    <!-- ... -->

    <!-- Submit button -->
    <div class="row">
        <div class="col-md-11">
            <div class="form-group">
                <button type="submit" class="btn btn-custom">Submit</button>
            </div>
        </div>
    </div> <!-- End row -->
</form> <!-- End form -->


<!-- Start of other user creation form //////////////////////////////// -->
<form method="post" action="/other-user">
    <!-- First name, last name -->
    <!-- ... -->

    <!-- Submit button -->
    <div class="row">
        <div class="col-md-11">
            <div class="form-group">
                <button type="submit" class="btn btn-custom">Submit</button>
            </div>
        </div>
    </div>
</div> <!-- End container -->

【问题讨论】:

    标签: javascript node.js express routing


    【解决方案1】:

    您以不正确的方式使用路由中间件。

    app.use('/user/:id', require('./routes/user'));
    app.use('/user-update', require('./routes/user'));
    app.use('/requser', require('./routes/requser'));
    app.use('/direct-user', require('./routes/requser'));
    app.use('/other-user', require('./routes/requser'));
    

    这些行是有问题的行。

    让我们以其中一个为例,第三个,因为它本身就足以处理 /direct-user/other-user 端点。

    该行告诉 express 要做的是:

    当请求到达路径以 /requser 开头的服务器时,将该请求传递给 requser 路由器中间件,它会处理其余的。

    假设您的请求是到路径/requser/direct-user。该请求将被传递给 requser 中间件,该中间件将匹配剩余部分 (/direct-user) 并正确调用相关回调。

    在不知道您的表单将数据发布到哪里的情况下,我无法进一步帮助您。但是您应该检查两个表单是否分别将它们的数据发布到/requser/direct-user/requser/other-user,它应该可以工作。

    【讨论】:

    • 行得通!我只是错过了表单中操作的 /requser/ 部分。谢谢可以!
    【解决方案2】:
    app.use('/user/:id', require('./routes/user'));
    

    所有这些代码行都在告诉您的应用使用从该文件导出的路由,并使用“/user/:id”作为前缀。因此,如果您想使用该文件中的所有路由,所有路由现在都以 '/users/:id' + 您在文件中创建的路由开头。

    假设您有以下路线

    router.post('/direct-user', function(req, res) {
        // Validate form contents
        // ...
    
        // Assuming all is well
        console.log('Direct user requested');
        res.send('cool');
    });
    

    那么你的真实路线将是'/users/:id/direct-user'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2019-09-02
      • 2015-01-03
      • 2014-06-08
      • 2013-03-01
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多