Node.js中的路由模块出现"无法获取 /en/first"错误



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

错误Cannot GET /en/first

关键是要有许多像 en 这样的文件夹,每个文件夹都有它的路由。 将它们组合在索引中.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

/视图/索引.js

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

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

module.exports = router

应用.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 文件中那样的路由?

它应该是

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)
});
});

我不认为路由器可以使用另一个路由器。相反,在应用程序中.js do

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 个数组来存储所有路由和所有匹配的视图名称。循环遍历它们并应用它们。

最新更新