Node.js、Express、Mongooseを初めて使用したときは、コードのスケーリングに苦労していました。私の答えの目的は、単なるブログ以上の作業をしている人を支援することですが、さらに大規模でスケーラブルなプロジェクトを支援することです。
- 私は常にデータベースに接続しています。必要に応じて接続を開いたり閉じたりしません
-
index.js
を使用しています 他の言語で行うのと同じように、フォルダのルートファイルとして - モデルは独自のドキュメントに保持され、
require()
dをmodels/index.js
に挿入します ファイル。 - ルートはモデルに似ており、各ルートレベルには、
index.js
を持つフォルダーがあります。 順番にファイル。したがって、http://example.com/api/documents/:id
のようなものを簡単に配置できます。 。また、ファイル構造を確認するときにも意味があります。
私が使用しているものの構造は次のとおりです。
-- app.js
-- models/
---- index.js
---- blog.js
-- mongoose/
---- index.js
-- routes/
---- index.js
---- blog/index.js
-- public/
-- views/
---- index.{your layout engine} => I use Jade.lang
-- methods/
---- index.js => use if you'd rather write all your functions here
---- blog.js => can store more complex logic here
app.js
var db = require('./mongoose'),
express = require('express');
// note that I'm leaving out the other things like 'http' or 'path'
var app = express();
// get the routes
require('./routes')(app);
// I just require routes, without naming it as a var, & that I pass (app)
mongoose / index.js
// Mongoose connect is called once by the app.js & connection established
// No need to include it elsewhere
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog');
// I have just connected, and I'm not exporting anything from here
models / index.js
// Logic here is to keep a good reference of what's used
// models
Blog = require('./blog');
// User = require('./user');
// exports
exports.blogModel = Blog.blogModel;
// exports.userModel = User.userModel;
models / blog.js
したがって、作業するすべてのモデルに対して、model.js
を作成します。 ドキュメントを作成し、models/index.js
に追加します その上。例として、User
を追加しました モデルですがコメントアウトしました。
// set up mongoose
var mongoose = require('mongoose');
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var BlogSchema = Schema({
header: {type: String },
author: {type: String },
text: {type: String },
_id: { type: ObjectId } // not necessary, showing use of ObjectId
});
Blog = mongoose.model('Blog', BlogSchema);
// the above is necessary as you might have embedded schemas which you don't export
exports.blogModel = Blog;
routers / index.js
module.exports = function(app) {
app.get('/', function(req, res) {
// do stuff
});
require('./blog')(app);
// other routes entered here as require(route)(app);
// we basically pass 'app' around to each route
}
routers / blog / index.js
module.exports = function(app) {
app.get('/blog', function(req, res) {
// do stuff
});
require('./nested')(app);
// this is for things like http://example.com/blog/nested
// you would follow the same logic as in 'routes/index.js' at a nested level
}
推奨される使用法
- モデル:ドキュメントを処理するロジックを作成するため。つまり、作成、更新、削除、検索。
- ルート:最小限のコーディング。httpデータを解析し、モデルのインスタンスを作成してから、関連するモデルにクエリを送信する必要がある場合のみ。
- メソッド:モデルを直接含まない、より複雑なロジック用。例として、私は
algorithms/
を持っています アプリで使用するすべてのアルゴリズムを保存するフォルダー。
これがより明確になることを願っています。この構造は、わかりやすいと思うので、私にとっては不思議に思っています。