【问题标题】:Node.js: Configuration and routes in a different fileNode.js:不同文件中的配置和路由
【发布时间】:2012-01-16 08:41:38
【问题描述】:

我正在启动一个新的 Node.js 应用程序,这一次,我试图正确地组织代码,而不是将所有内容都放在同一个文件中。

我现在在server.coffee 上只有一个简单的设置:

express = require 'express'
app = module.exports = express.createServer()

## CONFIGURATION ##

app.configure () ->
 app.set 'views', __dirname + '/views'
 app.set 'view engine', 'jade'
 app.use express.bodyParser()
 app.use express.logger('dev')
 app.use express.profiler()
 app.use express.methodOverride()
 app.use app.router
 app.use express.static(__dirname + '/public')

app.configure 'development', () ->
 app.use express.errorHandler({dumpExceptions: true, showStack: true})

app.configure 'production', () ->
 app.use express.errorHandler()

app.get '/', (req,res) ->
  res.render 'index'
    title: 'Express'

## SERVER ##
port = process.env.PORT || 3000 

app.listen port, () ->
  console.log "Listening on port" + port

我对这个简单的代码有一些疑问,我知道所有答案都取决于开发人员,但我真的想把它做对:

  • server.js 文件应该比app.listen 多吗?究竟应该有什么?
  • 不应该所有配置都在与路由不同的文件中吗?如何在运行server.coffee 时将app.get 删除到其他文件并使其正常工作?
  • 我在 Hubot 等许多应用程序中看到的 index.coffee 到底应该包含什么?

我希望有人能给我一个“取决于”以外的答案。

【问题讨论】:

    标签: javascript node.js coffeescript express


    【解决方案1】:

    您可以利用require,并将app var 作为参数传递给方法。它不是最漂亮的语法,在 CoffeeScript 中也不是,但你应该明白。

    routes.js

    module.exports = function (app) {
        // set up the routes themselves
        app.get("/", function (req, res) {
            // do stuff
        });
    };
    

    app.js

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

    如果你想更进一步,我会将我的路线分成更小的组,并放在它自己的子文件夹中。 (例如:routes/auth.js 用于登录/注销,routes/main.js 用于家庭/关于/联系等)

    路由/index.js

    // export a function that accepts `app` as a param
    module.exports = function (app) {
        require("./main")(app);
        // add new lines for each other module, or use an array with a forEach
    };
    

    (将之前的routes.js重命名为routes/main.js,源本身保持不变)

    【讨论】:

    • 感谢@Dominic,这是我一直在寻找的,关于如何制作应用程序架构的建议。 expressjs 家伙应该在他们的页面上有这样的东西。
    • 我建议您看一下有关 express.Router() expressjs.com/migrating-4.html#express-router 的示例,它与此非常相似,但它帮助我更加了解了这一点。
    • 上面的链接坏了。
    • @Nick Pineda:链接是expressjs.com/en/guide/migrating-4.html。不再有“#express-router”锚点 - 您只需向下滚动到“express.Router”...或“birds.js”。
    【解决方案2】:

    用 express.Router 类表达 4 simplifies 这个。

    另一个帮助组织路由的特性是一个新类express.Router,您可以使用它来创建模块化的可安装路由处理程序。一个Router实例是一个完整的中间件和路由系统;因此,它通常被称为“迷你应用”。

    以下示例将路由器创建为模块,在其中加载中间件,定义一些路由,并将其挂载到主应用程序的路径上。

    在app目录下创建一个名为birds.js的路由文件,内容如下:

    var express = require('express');
    var router = express.Router();
    
    // middleware 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 和/birds/about 的请求,以及调用特定于路由的timeLog 中间件。

    【讨论】:

      【解决方案3】:

      有两个类似的问题可以帮助你很多:

      How to structure a express.js application?

      Nodejs/Expressjs app structure

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        相关资源
        最近更新 更多