【问题标题】:Nodejs Express router.get('/') in users.jsusers.js 中的 Nodejs Express router.get('/')
【发布时间】:2018-02-24 10:28:40
【问题描述】:

我仍在尝试学习 NodeJ,但我遇到了我在 Express 中遇到的这条路径。当我使用 Express 创建应用程序时,我注意到在 app.js 我有这些代码行 var index = require('./routes/index'); var users = require('./routes/users'); app.use('/', index); app.use('/users', users);

并且在 users.js 我已经配置好了

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

我真的不明白为什么它在 users.js 中 router.get('/') 而不是 app.js 中指定的 router.get('/users')?有人可以解释一下在这种情况下发生了什么吗? 据我在 app.js 中的理解,它说每当有人试图访问指定的路由('/users')让我们在浏览器中说localhost:3000/users,让用户变量中所需的文件来处理它。

【问题讨论】:

  • /users in app.js 是每个路由的前缀。如果您的 url 有 /user/add 而不是在 user.js 文件中找到 /add 路由。对于 /user 它将在 user.js 文件中搜索 / 路由。

标签: node.js express routes


【解决方案1】:

如果您正在使用路线,则 express 应用会自动运行。这是 express.js 网站上的一个示例:

在我们的路由器文件中,我们有:

var express = require('express')
var router = express.Router()

// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
  console.log('Time: ', Date.now())
  next()
})
// define the home page route
router.get('/', function (req, res) {
  res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
  res.send('About birds')
})

module.exports = router

然后在我们的主文件中,我们将我们的服务器等加载到路由器中:

var birds = require('./birds')

// ...

app.use('/birds', birds)

路由器应用程序中的这些路由只有在有对/birds url 的请求时才会被访问。路由器中的所有路由现在都自动盯着/birds

所以在快速路由器中的这段代码:

// im code in the birds router
router.get('/about', function (req, res) {
  res.send('About birds')
})

仅在有人向/birds/about url 发出获取请求时执行。

更多信息在the official express.js docs

【讨论】:

    【解决方案2】:

    我只是想指出我在经历了一些挫折之后今天学到的东西,也许有人可以详细说明为什么会发生这种情况。无论如何,如果像我一样,您想对所有用户路由使用“/users”或对所有管理员路由使用“/admin”,那么正如上面提到的 WillemvanderVeen,您需要将以下代码添加到您的主 app.js 文件中

    var users = require('./routes/users')
    
    app.use('/users', users)
    

    但是,没有提到的一件事是,您在 app.js 中声明 'app.use('/users', users)' 的顺序很重要。例如,您将有两个路由处理文件:

    /routes/index.js

    const express = require('express');
    const router = express.Router();
    
    router.get('/', (req, res) => { res.render('index') });
    

    /routes/users.js

    const express = require('express'); const router = express.Router();
    
    router.get('/', (req, res) => { res.send('users route') })
    

    然后,您将在您的主 app.js 文件中要求它们:

    app.js

    const express = require('express');
    const app = express();
    
    const index = require('./routes/index');
    const users = require('./routes/users');
    
    app.use('/', index);
    app.use('/users', users);
    

    并且您会期望,当您点击“/users”路线时,您会收到res.send('users route') 页面。

    这对我不起作用,直到最近我都在努力寻找任何解决方案,这就是为什么我现在发表评论来帮助你。

    相反,我像这样交换了app.js 中的app.use() 声明并且它起作用了:

    app.js

    const express = require('express');
    const app = express();
    
    const index = require('./routes/index');
    const users = require('./routes/users');
    
    app.use('/users', users);
    app.use('/', index);
    

    现在,当我点击“/users”时,我会看到“users route”消息。希望这会有所帮助。

    但要回答您的问题,当您将 app.js 中的路由处理程序配置为用户时,您需要一个路由器文件 (./routes/users) 来处理来自该文件的所有请求并将它们发送到 URL /用户第一。因此,如果您执行以下操作:

    /routes/users.js

    router.get('/dashboard', (req, res) => { 
        // get user data based on id and render it
        res.render('dashboard') 
    });
    

    那么每当用户登录并进入仪表板时,URL 将是 /users/dashboard。

    【讨论】:

    • 感谢您的评论。这是一种奇怪的行为。我按那个顺序买了它们,它可以工作
    • 你发布的那个,你得到了错误:app.use('/', index); app.use('/users', users);我不必为了工作而把用户路线放在前面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2021-02-09
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多