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

Eri*_*Red 102 javascript modularity node.js express

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

Cha*_*nce 82

我把我的分手如下:

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

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

module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema);
Run Code Online (Sandbox Code Playgroud)

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

var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();
Run Code Online (Sandbox Code Playgroud)

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

(假设我们正在路线文件夹中工作,需要先升级1级然后转到模型)


编辑4

快递维基具有建立在它之上的框架的列表.

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

derby.js看起来也非常有趣.它类似于没有所有炒作的流星,实际上在信用到期时给予信用(特别是节点和快递).


编辑3

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


编辑2

如果你熟悉Rails并且不介意一些概念的流血,那就是机车.它是一个基于Express的轻量级框架.它具有与RoR非常相似的结构,并且带有一些更基本的概念(例如路由).

即使您不打算使用它也值得一试.


编辑1

nodejs-express-mongoose-demo与我的结构非常相似.看看这个.

  • 业务逻辑在哪里?您是否曾使用帮助程序进行身份验证等操作? (2认同)

Ray*_*nos 9

警告:引用我一起攻击节点淘汰的代码,它有点工作,但远非优雅或抛光.

为了更具体地分割app.js我有以下app.js文件

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

bootstrap(app);
Run Code Online (Sandbox Code Playgroud)

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

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

好吧,它将所有服务器初始化设置拆分为漂亮的块.特别

  • 我有一个块,使用everyauth设置我的所有远程OAuth身份验证.
  • 我有一个配置我的应用程序的块(基本上是调用app.configure)
  • 我有一些较少的代码,所以它在运行时重新编译我的任何较少的css.
  • 我有代码设置我的所有路线
  • 我称之为小型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);
Run Code Online (Sandbox Code Playgroud)

在这里,我将所有模型和路径加载为文件数组.

免责声明: readdirSync只有在启动http服务器之前调用时才可以(之前.listen).在服务器启动时调用同步阻塞调用只会使代码更具可读性(它基本上是一个hack)

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

在这里我打socket.io实际使用授权,而不是让任何汤姆和杰克与我的socket.io服务器通信

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

        route(app, model, io);
    });
};
Run Code Online (Sandbox Code Playgroud)

在这里,我通过将相关模型传递到路径文件返回的每个路径对象来启动我的路由.

基本上,jist是你将所有东西组织成漂亮的小模块,然后有一些自举机制.

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

免责声明:博客坏了,没有建立,我正在努力.