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

Posted

技术标签:

【中文标题】Node.js:不同文件中的配置和路由【英文标题】:Node.js: Configuration and routes in a different file 【发布时间】: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 到底应该包含什么?

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Node.js:不同文件中的配置和路由的主要内容,如果未能解决你的问题,请参考以下文章

nvm npm node.js的关系

Node.js log4j-like 日志系统

Node.js Buffer(缓冲区)

将“Vanilla”Javascript 库加载到 Node.js 中

Node.js 的设计错误

Node.js的安装和一些简单的使用