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

Node.js: Configuration and routes in a different file

本文关键字:文件 路由 js 配置 Node      更新时间:2023-09-26

我正在启动一个新的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究竟应该包含什么?

我希望有人能给我一个答案,而不是"视情况而定"。

您可以利用require,并简单地将app变量作为参数传递给方法。这不是最漂亮的语法,也不是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用于home/about/contact等)

路线/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,源本身保持不变)

Express 4用express.Router类简化了这一点。

另一个帮助组织路由的特性是一个新的类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;

然后,在应用中加载router模块:

var birds = require('./birds');
app.use('/birds', birds);

应用程序现在将能够处理到/birds/birds/about的请求,以及调用特定于路由的timeLog中间件。

有两个类似的问题可以帮助你解决这个问题:

如何构建express.js应用程序?

Nodejs/Expressjs应用程序结构