Node.js:配置和路由在不同的文件中

don*_*ald 16 javascript node.js coffeescript express

我正在启动一个新的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
Run Code Online (Sandbox Code Playgroud)

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

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

我希望有人可以给我一个答案,而不是"它取决于".

Dom*_*nes 35

您可以利用require并简单地将appvar in作为参数传递给方法.它不是最漂亮的语法,也不是CoffeeScript中的语法,但你应该明白这一点.

routes.js

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

app.js

require("./routes")(app);
Run Code Online (Sandbox Code Playgroud)

如果你想更进一步,我将我的路线分成更小的组,并在它自己的子文件夹中.(如: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
};
Run Code Online (Sandbox Code Playgroud)

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


Kon*_*che 7

Express 4 在课堂上简化了这一点express.Router.

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

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

创建birds.jsapp目录中指定的路由器文件,其中包含以下内容:

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;
Run Code Online (Sandbox Code Playgroud)

然后,在应用程序中加载路由器模块:

var birds = require('./birds');
app.use('/birds', birds);
Run Code Online (Sandbox Code Playgroud)

该应用程序现在能够处理请求/birds/birds/about与调用一起timeLog具体的路线中间件.