これは具体的なアプリ/コードの質問ではなく、一般的なアプリアーキテクチャに関するものです。
マングースアプリケーションを整理する適切な方法を理解しようとしています。私はマングースに慣れていないので、それが今のやり方です。
core/settings.js
var mongoose = require('mongoose');
exports.mongoose = mongoose;
mongoose.connect('mongodb://localhost/blog');
exports.db = mongoose.connection;
core/models.js
settings = require("./settings");
// post schema
var postSchema = settings.mongoose.Schema({
header: String,
author: String,
text: String
})
//compiling our schema into a Model
exports.post = settings.mongoose.model('post', postSchema)
core/db-layer.js
settings = require("./core/settings");
models = require("./core/models");
exports.function = createAndWriteNewPost(function(callback) {
settings.db.on('error', console.error.bind(console, 'connection error:'));
settings.db.once('open', function callback() {
new models.post({
header: 'header',
author: "author",
text: "Hello"
}).save(function(err, post) {
callback('ok');
});
});
});
routes/post.js
db = reqiure("../core/db.js")
exports.get = function(req, res) {
db.createAndWriteNewPost(function(status){
res.render('add_material', {
//blah blah blah
});
});
};
app.js
var post = require ('routes/post.js')
...
app.get('/post', post.get);
したがって、このコードは、私の現在のアーキテクチャの考えを示すためだけに、非常に単純化されています(テストされていなくても)。これは具体的なアプリではなく、抽象的なブログ投稿を作成するようなものです。それがどのように機能するかです:
app.js --> routes/post.js <--> core/db-layer.js
|
v
core/models.js <--> core/settings.js
それは私には少し余分に思えます。より最適なアプリ構造を提案できますか?ありがとう。
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;
_
routes/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
}
_
routes/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
}
_
推奨される使用法
algorithms/
_フォルダーがあります。これがより明確になることを願っています。この構造は、私が理解しやすいと思うので、私にとっては不思議に働いています。
いくつかの違いはありますが、それは私がそれを行う方法とほぼ同じです。