Node.js中的路由模块出现“无法GET / en / first”错误

时间:2017-07-17 15:51:05

标签: javascript node.js express module routing

我正在尝试在Node.js&中创建路由模块。表达,我不知道我做错了什么。

错误为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文件中一样使用数组而不是路由吗?

2 个答案:

答案 0 :(得分:0)

应该是

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

答案 1 :(得分:0)

我认为路由器不能使用其他路由器。而是在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

并在app中加载:

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)=> {})
  4. 您可以执行任何想要存储它们的操作并构建路径。也许你可以拥有一个包含所有信息的对象数组并执行:

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

    如果您知道它们的外观,您还可以使用构建中间件的功能:

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

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