【问题标题】:adding a new route to node express向 node express 添加新路由
【发布时间】:2013-05-09 01:16:36
【问题描述】:

我正在尝试在我的快速应用程序中添加新路由,但在尝试启动服务器时不断出错。错误是

C:\development\node\express_app\node_modules\express\lib\router\index.js:252
    throw new Error(msg);
          ^
Error: .get() requires callback functions but got a [object Undefined]

这是我的文件,我是 node 新手,如果我遗漏了重要文件,请告诉我

路线/家具.js

exports.furniture = function(req, res){
   res.render('furniture', { title: '4\267pli' });
};

路由/index.js

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: '4\267pli' });
};

views/furniture.ejs

<!DOCTYPE html>
<html>
<head>
    <title>4&middot;pli -- architecture</title>
    <link rel='stylesheet' href='/stylesheets/style.css'/>
    <link href='http://fonts.googleapis.com/css?family=Didact+Gothic' rel='stylesheet' type='text/css'>
</head>
<body>
<div class="wrapper">
    <h1 class="logo"><%= title %></h1>
</div>
</body>
</html>

app.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , furniture = require('./routes/furniture')
  , http = require('http')
  , path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/furniture', routes.furniture);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

【问题讨论】:

    标签: node.js routing express


    【解决方案1】:

    问题是:

     routes = require('./routes'),
     user = require('./routes/user'),
     furniture = require('./routes/furniture'),
    

    这3个是设置你的路由文件夹,不是特定的文件,express会找一个index.js(没找到,然后-->错误)

    在这些文件夹中,您应该将 index.js 与您的:

    exports.xxxx =  function(req, res){
        res.render('xx', { foo: foo});
    };
    

    然后,您的项目文件夹结构应如下所示:

    routes/
      ├── index.js
      │
      ├── user/
      │     └── index.js (with a exports.user inside)
      │   
      └── fourniture/
            └── index.js (with a exports.furniture inside)
    

    您可以将多个导出功能添加到这样的路由中:

    app.js

    // a folder called routes with the index.js file inside
    routes = require('./routes')
    
    .
    .
    .
    
    app.get('/', routes.main_function);  
    app.get('/sec_route', routes.sec_function);
    app.post('/other_route', routes.other_function);
    

    /routes/index.js

    exports.main_function =  function(req, res){
        res.render('template1', { foo: foo });
    };
    
    exports.sec_function =  function(req, res){
        res.render('template2', { bar: bar });
    };
    
    exports.other_function =  function(req, res){
        res.render('template1', { baz: baz });
    };
    

    【讨论】:

    • @3boll 如果你想在 user 下拥有多个函数怎么办... index.js admin.js 和 foo.js... 你会怎么写呢?
    • 似乎 user = require('./routes/user') 也可以与路由文件夹中保存的 user.js 文件相关
    • 哦,亲爱的,@Cmag 和 1dolinski 说这是个坏主意,但它获得了如此多的认可。
    【解决方案2】:

    如果您的网站很大,有时我更喜欢这样做:

    routes/furniture.js:

    module.exports = function(app)
    {
        app.get("/furniture/", function(req, res) {
            res.render('furniture', { title: '4\267plieee' });
        });
    }
    

    然后在app.js:

    require("./routes/furniture")(app);
    

    基本相同,但 app.js 会更干净。

    【讨论】:

    • 这绝对是一个不错的方法,因为它实际上将 HTTP 路由本身保存在路由文件夹中。
    【解决方案3】:

    虽然这有点旧,但分享我这样做的方式。这是另一种方法,它使代码更简洁,更容易添加路由。

    app.js

    const app = express();
    const routes = require('./routes');
    app.use('/api', routes); //Main entry point
    

    /routes/index.js

    const router = require('express').Router();
    const user = require('./user');
    const admin = require('./admin'); 
    
    //This is a simple route
    router.get('/health-check', (req, res) =>
        res.send('OK')
    );
    
    router.route('/users')
          .post(validate, user.createUser);
    
    router.route('/users/:userId')
          .get(validateUser, user.getUser)  
          .patch(validateUser, user.updateUser)
          .delete(validateUser, user.deleteUser);
    
    router.route('/admins/:adminId/dashboard')
          .get(validateAdmin,admin.getDashboard);
    
    module.exports = router;
    

    'validateUser' 和 'validateAdmin' 是自定义的中间件,它们将用于验证请求参数或在请求到达实际请求处理程序之前进行一些预处理。这是可选的,您也可以拥有多个中间件(逗号分隔)。

    /routes/user.js

    module.exports = {
      createUser:function(req,res,next){
    
      },
      updateUser:function(req,res,next){
    
      },
      deleteUser:function(req,res,next){
    
      }
    }
    

    /routes/admin.js

    module.exports = {
      getDashboard:function(req,res,next){
    
      }
    }
    

    【讨论】:

      【解决方案4】:

      遵循简单一致的文件夹结构,然后使用模块自动完成所有工作。

      那就永远不要回头。将节省的时间花在其他重要的事情上。

      TL;DR

      $ npm install express-routemagic --save
      
      const magic = require('express-routemagic')
      magic.use(app, __dirname, '[your route directory]')
      

      就是这样!

      更多信息:

      你会怎么做呢?让我们从文件结构开始:

      project_folder
      |--- routes
      |     |--- nested-folder
      |     |     |--- index.js
      |     |--- a-file-that-doesnt-share-same-name-with-another-folder.js
      |     |--- index.js
      |--- app.js
      

      在 app.js 中

      const express = require('express')
      const app = express()
      const magic = require('express-routemagic')
      magic.use(app, __dirname, 'routes')
      

      在您的任何路由文件中:

      例如,index.js

      const router = require('express').Router()
      
      router.get('/', (req, res) => { ... })
      router.get('/something-else', (req, res) => { ... })
      

      或者一个文件不共享相同名称与另一个文件夹.js

      通常您可能想要启动一个文件夹并使用index.js 图案。但如果是小文件也没关系。

      const router = require('express').Router()
      const dir = 'a-file-that-do-not-have-another-folder-with-same-name' // you can use this to shorten, but it's optional.
      
      router.get(`$(dir)/`, (req, res) => { ... })
      router.get(`$(dir)/nested-route`, (req, res) => { ... })
      

      免责声明:我写了这个包。不过真的是姗姗来迟,等人来写已经到了我的极限了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-08
        • 2018-04-23
        • 2018-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多