app.js
在Express.js应用程序中是否有用于分解和module化文件的通用约定?或者将所有内容保存在一个文件中很常见吗?
如何构建 express.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);
然后如果我需要创建一个电话号码,就像这样简单:
var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();
如果我需要使用架构,那么 PhoneNumber.schema
(假设我们正在从 routes 文件夹工作并且需要向上一级然后向下一级到模型)
编辑 4
该快递维基具有建立在它之上的框架的列表。
其中,我认为 Twitter 的斗牛士结构非常好。我们实际上使用了一种非常相似的方法来加载应用程序的各个部分。
derby.js看起来也非常有趣。它类似于没有所有炒作的流星,实际上在信用到期时给予信用(特别是节点和快递)。
编辑 3
如果您是 CoffeeScript 的粉丝(我不是)并且 reeeeaaaaaly 想要 Rails 的 L&F,那么还有Tower.js。
编辑 2
如果您熟悉 Rails 并且不介意某些概念的混淆,那么Locomotive。它是一个基于 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 身份验证的块。
- 我有一个配置我的应用程序的块(基本上是调用
app.configure
) - 我有一些代码较少,因此它在运行时将我的任何较少内容重新编译为 css。
- 我有设置我所有路线的代码
- 我称这个小 nko module
- 最后,我通过侦听端口来启动服务器。
举个例子,让我们看看路由文件
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);
在这里,我将所有模型和路由加载为文件数组。
免责声明: readdirSync
仅在启动 http 服务器之前(之前.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 实际使用授权,而不是让任何 tom 和 jack 与我的 socket.io 服务器交谈
routes.forEach(function(file) {
var route = require(routeUrl + file),
model = require(modelUrl + file);
route(app, model, io);
});
};
在这里,我通过将相关模型传递到从路由文件返回的每个路由对象来开始我的路由。
基本上 jist 是你将所有东西组织成漂亮的小module,然后有一些引导机制。
我的另一个项目(我的博客)有一个类似结构的 init 文件。
免责声明:该博客已损坏且无法构建,我正在努力。
为了维护路由组织你可以看看这篇文章有关的明示,routescan节点module和尝试。这对我来说是最好的解决方案。
我的应用程序构建在 express-generator 工具之上。您可以通过运行安装它 npm install express-generator -g
并使用express <APP_NAME>
.
为了给您一个视角,我的一个较小的应用程序结构如下所示:
~/
|~bin
| |-www
|
|~config
| |-config.json
|
|~database
| |-database.js
|
|~middlewares
| |-authentication.js
| |-logger.js
|
|~models
| |-Bank.js
| |-User.js
|
|~routes
| |-index.js
| |-banks.js
| |-users.js
|
|~utilities
| |-fiat-converersion.js
|
|-app.js
|-package.json
|-package-lock.json
我喜欢这种结构的一件很酷的事情是我最终在我开发的任何快速应用程序中采用的这种结构是路由的组织方式。我不喜欢将每个路由文件都要求到 app.js 和app.use()
每个路由中,尤其是当文件变大时。因此,我发现将我的所有内容分组和集中app.use()
在 ./routes/index.js 文件中很有帮助。
最后,我的 app.js 将如下所示:
...
const express = require('express');
const app = express();
...
require('./routes/index')(app);
我的 ./routes/index.js 看起来像这样:
module.exports = (app) => {
app.use('/users', require('./users'));
app.use('/banks', require('./banks'));
};
我之所以能够这样做,仅仅require(./users)
是因为我使用 express.Router() 编写了用户路由,它允许我“分组”多个路由,然后一次导出它们,目的是使应用程序更加module化。
这是您可以在我的 ./routers/users.js 路由上使用的示例:
const router = require('express').Router();
router.post('/signup', async (req, res) => {
// Signup code here
});
module.exports = router;
希望这有助于回答您的问题!祝你好运!