如何构build一个express.js应用程序?

Express.js应用程序中分解和模块化app.js文件是否有共同的约定? 或者将所有内容保存在单个文件中很常见?

我有我的分手如下:

 ~/app |~controllers | |-monkey.js | |-zoo.js |~models | |-monkey.js | |-zoo.js |~views | |~zoos | |-new.jade | |-_form.jade |~test | |~controllers | |-zoo.js | |~models | |-zoo.js |-index.js 

我使用Exports来返回相关的内容。 例如,在我做的模型中:

 module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema); 

然后如果我需要创build一个电话号码,就像这样简单:

 var PhoneNumber = require('../models/phoneNumber'); var phoneNumber = new PhoneNumber(); 

如果我需要使用模式,那么PhoneNumber.schema

(它假设我们正在从路线文件夹工作,需要去1级,然后到模型)


编辑4

快速维基上有一个框架的列表。

其中,我认为Twitter的斗牛士结构相当好。 实际上,我们使用了一种非常类似的方法来加载应用程序的某些部分。

derby.js也看起来非常有趣。 这与meteor没有所有的炒作类似,实际上在信贷到期时给予信贷(特别是节点和快递)。


编辑3

如果你是CoffeeScript的粉丝(我不是),并且想要Rails的L&F,那么还有Tower.js


编辑2

如果你熟悉Rails,不介意一些概念的stream血,那就是Locomotive 。 这是一个build立在Express上的轻量级框架。 它具有与RoR非常相似的结构,并承载了一些更基本的概念(如路由)。

即使你不打算使用它,也值得检查。


编辑1

nodejs-express-mongoose-demo与我的结构非常相似。 一探究竟。

警告:引用的代码我一起砍了节点淘汰赛,这样的作品,但远远没有优雅或抛光。

更具体的关于分裂app.js我有以下app.js文件

 var express = require('express'), bootstrap = require('./init/bootstrap.js'), app = module.exports = express.createServer(); bootstrap(app); 

这基本上意味着我把所有的引导放在一个单独的文件,然后我引导服务器。

那么bootstrap是做什么的?

 var configure = require("./app-configure.js"), less = require("./watch-less.js"), everyauth = require("./config-everyauth.js"), routes = require("./start-routes.js"), tools = require("buffertools"), nko = require("nko"), sessionStore = new (require("express").session.MemoryStore)() module.exports = function(app) { everyauth(app); configure(app, sessionStore); less(); routes(app, sessionStore); nko('/9Ehs3Dwu0bSByCS'); app.listen(process.env.PORT); console.log("server listening on port xxxx"); }; 

那么它分裂所有的服务器初始化设置好的块。 特别

  • 我有一个使用everyauth设置所有远程OAuth身份validation的块。
  • 我有一个configuration我的应用程序块(基本上调用app.configure
  • 我有一点点的代码less打,所以它在运行时重新编译我的less。
  • 我有设置所有我的路线的代码
  • 我把这个叫做nko模块
  • 最后,我通过监听一个端口来启动服务器。

举个例子,让我们看一下路由文件

 var fs = require("fs"), parseCookie = require('connect').utils.parseCookie; module.exports = function(app, sessionStore) { var modelUrl = __dirname + "/../model/", models = fs.readdirSync(modelUrl), routeUrl = __dirname + "/../route/" routes = fs.readdirSync(routeUrl); 

在这里我加载所有我的模型和路线作为文件的数组。

免责声明:只有在启动http服务器之前.listen 才可以 (在.listen之前)。 在服务器启动时调用同步阻塞调用只是使代码更易读(这基本上是一个黑客)

  var io = require("socket.io").listen(app); io.set("authorization", function(data, accept) { if (data.headers.cookie) { data.cookie = parseCookie(data.headers.cookie); data.sessionId = data.cookie['express.sid']; sessionStore.get(data.sessionId, function(err, session) { if (err) { return accept(err.message, false); } else if (!(session && session.auth)) { return accept("not authorized", false) } data.session = session; accept(null, true); }); } else { return accept('No cookie', false); } }); 

在这里,我冲socket.io实际使用授权,而不是让任何汤姆和插孔与我的socket.io服务器交谈

  routes.forEach(function(file) { var route = require(routeUrl + file), model = require(modelUrl + file); route(app, model, io); }); }; 

在这里,我通过将相关模型传递给路由文件返回的每个路由对象来开始我的路由。

jist基本上就是把所有东西组织成漂亮的小模块,然后有一些引导机制。

我的另一个项目(我的博客) 有一个类似结构的init文件 。

免责声明:博客是坏的,不build立,我正在努力。

对于可维护的路由组织,您可以查看关于express-routescan节点模块的文章并尝试。 这对我来说是最好的解决scheme。