【问题标题】:Express rendering in/after post发布中/发布后的快速渲染
【发布时间】:2016-06-23 14:13:18
【问题描述】:

Web 应用程序路由新手在这里。我有一个基于 Node/Express 的相对简单的应用程序。

应用程序的主要索引是用户名和 ID 列表。

localhost:242

每个用户 ID 都是指向页面的链接,其中包含用于输入有关该特定用户的其他元数据的表单。

localhost:242/user/1398

一切正常。当我输入一些关于用户的元数据并提交表单时,会执行一个 POST 路由,然后我被重定向回原来的页面。我希望能够重新呈现同一页面,而不是使用重定向,这样我可以传递一些确认消息,指示刚刚更改的内容。

这是我的代码的简化版本。

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

router.get('/', function(req, res, next) {
    db.dataTalk(queryUsers, null, config.connection, function(err, result) {    
        var listUsers = result;

        res.render('index', {
            // Index with list of users
            title: 'Page Title',
            listUsers: listUsers
        });
    });
});

// GET /user/:id
router.get('/user/:id', function(req, res, next) {
    db.dataTalk(queryUserDeets, [req.params.id], config.connection, function(err, result) {
        // Details for a single user
        var userDetails = result;

        res.render('user', {
            title: req.params.id,
            userDetails: userDetails
        });
    });
});

// POST /user-update
router.post('/user-update', function(req, res) {
    // Here goes a lot of logic to validate the form contents, and update the appropriate databases
    // Redirect back to the user page, which should display the updated metadata
    res.redirect('/user/' + req.body.userInitID);

});

module.exports = router;

【问题讨论】:

  • 您是否有理由不将重定向替换为 res.render()

标签: node.js express routes


【解决方案1】:

提取一个可以从两个地方调用的辅助函数。这是一个与您的原始代码非常接近的代码。

function renderUserPage (userId, res) {
    db.dataTalk(queryUserDeets, [userId], config.connection, function(err, result) {
        // Details for a single user
        var userDetails = result;

        res.render('user', {
            title: userId,
            userDetails: userDetails
        });
    });
});


// GET /user/:id
router.get('/user/:id', function (req, res) {
    renderUserPage(req.params.id, res)
});

// POST /user-update
router.post('/user-update', function(req, res) {
    // Here goes a lot of logic to validate the form contents, and update the appropriate databases
    // Redirect back to the user page, which should display the updated metadata
    renderUserPage(req.body.userInitID, res);
});

旁白:您忽略了来自数据库调用的错误。如果您至少不为传递给异步回调的每个错误记录一些内容,那么您将对原本可以直接调试的问题视而不见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2016-08-20
    • 2012-09-28
    • 2012-09-07
    相关资源
    最近更新 更多