Mongoose 기반 앱 아키텍처
이것은 구체적인 앱/코드 질문이 아니라 일반적인 앱 아키텍처에 관한 것입니다.
저는 몽구스 애플리케이션을 구성하는 적절한 방법을 이해하려고 노력하고 있습니다.몽구스가 처음이라 지금은 그렇게 하고 있습니다.
핵심/핵심제이에스
var mongoose = require('mongoose');
exports.mongoose = mongoose;
mongoose.connect('mongodb://localhost/blog');
exports.db = mongoose.connection;
core/module.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()
에.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)
몽구스/인덱스.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;
모델/모델.js
따라서 작업하는 모든 모델에 대해 다음을 생성합니다.model.js
문서화하고, 그것을 에 추가합니다.models/index.js
위에. 예를 들어, 저는 a를 추가했습니다.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/message/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
}
추천 용법
- 모델: 문서 작성, 업데이트, 삭제 및 검색과 같은 문서를 처리하는 논리를 만들기 위한 모델입니다.
- routes: 최소한의 코딩. http 데이터를 구문 분석하고 모델 인스턴스를 만든 다음 관련 모델로 쿼리를 보냅니다.
- 방법: 모델을 직접 포함하지 않는 더 복잡한 논리.예를 들어, 나는.
algorithms/
앱에서 사용하는 모든 알고리즘을 저장하는 폴더입니다.
이것이 더 명확해지기를 바랍니다.이 구조는 제가 따라하기 쉽다는 것을 알기 때문에 저에게 놀라운 효과가 있습니다.
몇 가지 차이점이 있지만, 제가 하는 방식은 거의 그렇습니다.
- 나는 당신이 db-layer에서 당신의 함수 안에 열린 청취자를 둘 수 없다고 생각합니다.당신과 같은 영구적인 연결을 사용할 때 제가 일반적으로 하는 일은 db open 핸들러에서 애플리케이션 자체를 시작하는 것입니다.영구 연결을 사용하지 않으려면 db 계층 기능에서 createConnection을 사용하고 콜백을 호출하기 전에 닫아야 합니다.제가 제 말을 분명히 하고 있는지 잘 모르겠습니다.코드 예제를 원하시면 알려주세요.
- 이는 일반적인 node.js 팁에 가깝지만 데이터베이스 연결 문자열과 기타 구성을 json 파일에 보관하고 필요한 곳이면 어디든 필요합니다.그 후에는 다른 settings.js 파일이 필요하지 않을 것입니다.
- 스키마 함수(http://mongoosejs.com/docs/api.html#schema_Schema-method) 를 사용하여 일부 앱 기능을 모델 자체에 코딩할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/15454441/mongoose-based-app-architecture
'code' 카테고리의 다른 글
들어오는 커밋을 보려면 어떻게 해야 합니까? (0) | 2023.07.07 |
---|---|
반환된 레코드 집합이 닫혔습니다(VBA의 ODBC를 통해 mysql DB에 액세스됨). (0) | 2023.07.07 |
빌드 환경에서 Google 서비스 파일의 Google_APP_ID를 가져올 수 없습니다. (0) | 2023.07.07 |
ASP의 이름을 바꿉니다.NET_세션이드 (0) | 2023.07.07 |
-u 플래그는 it push -u origin 마스터를 의미합니까? (0) | 2023.07.07 |