【问题标题】:`Cannot GET /en/first` error with routing module in Node.jsNode.js 中的路由模块出现“无法获取 /en/first”错误
【发布时间】:2017-12-22 05:54:34
【问题描述】:

我正在尝试在 Node.js & express 中创建路由模块,但我不明白我做错了什么。

错误是Cannot GET /en/first

关键是要有很多像en这样的文件夹,每个文件夹都有它的路由。 在 index.js 中将它们组合在一起,然后从 app.js 中调用它。

我的文件结构:

public
 -js
 -css
views
 -index.js
 -en
 --about.html
 --en.js
 --home.html
app.js

我的 en.js 文件

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

//en page1
router.get('/about1', function(req, res) {
  res.render('about1')
})

//en page2
router.get('/first', function(req, res) {
  res.render('first')
})

module.exports = router

/views/index.js

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


router.use('./en', require('./en/'))
router.use('./fr', require('./fr/'))


module.exports = router

app.js

var express = require("express");
var app = express();
var path = require('path');
var router = express.Router();

app.use(router);  

app.engine('ejs', require('ejs').__express)
app.set('view engine', 'ejs')

app.use(express.static(path.join(__dirname, 'public')));
app.use(require('./views'))


app.listen(3000,function(){
  console.log("Live at Port 3000");
});

还有一个选项可以使用数组而不是像 en.js 文件中的路由?

【问题讨论】:

  • 确保为您的问题提供明确的标题,以说明问题所在。这样,遇到类似问题的人就可以找到您的问题,并可能找到答案。

标签: javascript node.js express module routing


【解决方案1】:

应该是

router.use('/en', require('./en/en'))
router.use('/fr', require('./fr/fr'))

路线中不应有任何点。

编辑

关于您的第二个问题,是的,您可以使用数组:

const routes = ['about1', 'first']; // array of routes

routes.forEach(route => {
    router.get('/' + route, function (req, res) {
        res.render(route)
    });
});

【讨论】:

  • @GuyOren 我已经为en 文件添加了正确的路由,但我不知道你的fr 路由文件在哪里。
  • fr 应该是 en 文件夹旁边的文件夹,其中包含相同的文件.. 但如果 en 可以工作,那么 fr 也应该如此
  • 不,你试过了吗,它对你有用吗?在cmd中的node app.js之后,我得到console.log,尝试浏览器并发现错误
  • 控制台报错,加载资源失败:服务器响应状态为404(未找到)
【解决方案2】:

我不认为一个路由器可以使用另一个路由器。而是在 app.js 中做

app.use('./en', require('./view/en/en.js'))
app.use('./fr', require('./view/fr/fr.js'))

我个人不喜欢您将路由器文件放入视图文件夹的方式,因为它们没有定义视图。它们应该在自己的文件夹中。

对于你最后提出的问题。路由器只是一个小应用程序,它可以让您更轻松地定义子路由。例如你可以这样做:

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

// 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) // basically adding prefix to all the routes in bird router :)

生成的路线将是 /birds//birds/about

你基本上需要三件事来完成一个路由的定义:

  1. HTTP 请求方法,例如 GET、PUT 或 POST)
  2. 路线(字符串,例如“/about”)
  3. 中间件(带有 2-4 个参数的函数。(req,res,next)=>{})

您可以做任何您想做的事情来存储它们并构建路线。也许您可以拥有一个包含所有信息的对象数组并执行以下操作:

arrayOfRouteObjects.forEach((element)=>{
    app[element.method](element.route, element.middlewares)
})

如果你知道中间件的样子,你也可以有一个构造中间件的函数:

function renderView(viewName){
  return (req,res,next)=>{
    res.render(viewName);
  }
}

基本上你有 2 个数组来存储所有路由和所有匹配的视图名称。遍历它们并 app.get 全部。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2021-03-11
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多