code

Mongoose 기반 앱 아키텍처

starcafe 2023. 7. 7. 19:17
반응형

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

반응형