Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Въпрос относно бакенд дизайн(Node.js)

Featured Replies

Става дума за express с node. Въпросът ми е дали MongooseModule е repository и дали е редно да го използвам по този начин или трябва да имплементирам dependency injection? Редно ли е контролерите също да бъдат класове?
И ако трябва да ползвам DI, къде да инстанцирам всички обекти за пръв път?


Имам рутери, които ползват някакъв валидатор и т.н. middleware и накрая викат контролери. Контролерите правят елементарни неща от сорта на:

async function getUser (req, res) {
    const result = await UserServiceInstance.getUser(req.id);
    if(result.success){
       res.send(result.body);   
     }else{
       result.body.message ? res.status(404).send(result.body) : res.status(500).send(result.body)
    }
}

UserServiceInstance е инстанция на UserService клас. UserService пък в конструктора си приема инстанция на модул, който отговаря за работата с базата данни. В случая базата е Mongo. Въпросният модул repository ли е всъщност? Работата му е да извършва операции с базата вземайки model и изглежда така: 
 

class MongooseModule {

    /**
   * @description Create an instance of the MongooseModule class
   * @param Model {mongoose.model} Mongoose Model to use for the instance
   */
  constructor(Model){
    this.model = Model;
  }

  /**
   * @description Execute an aggregation pipeline
   * @param pipeline {array} Aggregate pipeline to execute
   * @param {object} session - Optional MongoDB session.
   * @returns {Promise} Returns the results of the query
  */
  aggregate(pipeline, session = null) {
    const query = this.model.aggregate(pipeline);
    if (session) {
      query.session(session);
    }
    return query.exec();
  }

/**
   * @description Create a new document on the Model
   * @param {object} body Body object to create the new document with
   * @param {object} session 
   * @returns {Promise} Returns the results of the query
   */
  create(body, session = null) {
    if (session) {
      return this.model.create([body], { session }).then(docs => docs[0]);;
    }
    return this.model.create(body);
  }
.... и т.н. 
}

Използвам го в сървисите по следния начин:
 

class UserService {

  constructor(){
    this.MongooseModuleInstance = new MongooseModule(UserModel);
  }
  

  async create(newUser){
    try {
      const existingUser = await this.MongooseModuleInstance.findOne({ email: newUser.email });
      if (existingUser) {
        return { success: false, message: 'User already exists' };
      }

      // MongooseModule calls .create() creating an atomic transaction calling .save(),
      // which triggers the mongoose middleware and hashes the password
      const { username, email, _id }  = await this.MongooseModuleInstance.create(newUser);
      const token = generateToken({username, email, _id})
      return { success: true, body: { username, email, _id }, token };

    } catch (e) {
      return { success: false, body: e.message}
    }
  }





 

Правил съм едно малко проектче за обучителни цели на nodejs express с mongo база с mongoose. Не съм ползвал никакви класове. 

Първо правя схема, после модел на база схемата и после работя с модела. Ето прост пример, генериран от чатджипити: 

  // Define a schema
  const Schema = mongoose.Schema;
  const mySchema = new Schema({
    name: String,
    age: Number
  });

  // Compile model from schema
  const MyModel = mongoose.model('MyModel', mySchema);

  // CREATE: Add a new document to the collection
  const instance = new MyModel({ name: 'John', age: 25 });
  instance.save(function (err) {
    if (err) return handleError(err);
    console.log("Document saved successfully");
  });

  // READ: Find documents in the collection
  MyModel.find({name: 'John'}, function(err, docs) {
    if (err) return handleError(err);
    console.log("Found the following documents:");
    console.log(docs);
  });

  // UPDATE: Update a document in the collection
  MyModel.updateOne({name: 'John'}, {age: 26}, function(err, res) {
    if (err) return handleError(err);
    console.log("Document updated successfully");
  });

  // DELETE: Remove a document from the collection
  MyModel.deleteOne({name: 'John'}, function(err) {
    if (err) return handleError(err);
    console.log("Document deleted successfully");
  });

 

  • Автор
преди 4 часа, anon9 написа:

Правил съм едно малко проектче за обучителни цели на nodejs express с mongo база с mongoose. Не съм ползвал никакви класове. 

Първо правя схема, после модел на база схемата и после работя с модела. Ето прост пример, генериран от чатджипити: 

  // Define a schema
  const Schema = mongoose.Schema;
  const mySchema = new Schema({
    name: String,
    age: Number
  });

  // Compile model from schema
  const MyModel = mongoose.model('MyModel', mySchema);

  // CREATE: Add a new document to the collection
  const instance = new MyModel({ name: 'John', age: 25 });
  instance.save(function (err) {
    if (err) return handleError(err);
    console.log("Document saved successfully");
  });

  // READ: Find documents in the collection
  MyModel.find({name: 'John'}, function(err, docs) {
    if (err) return handleError(err);
    console.log("Found the following documents:");
    console.log(docs);
  });

  // UPDATE: Update a document in the collection
  MyModel.updateOne({name: 'John'}, {age: 26}, function(err, res) {
    if (err) return handleError(err);
    console.log("Document updated successfully");
  });

  // DELETE: Remove a document from the collection
  MyModel.deleteOne({name: 'John'}, function(err) {
    if (err) return handleError(err);
    console.log("Document deleted successfully");
  });

 

Не разбирам това какво общо има с въпроса ми за дизайн патърни... Освен това да се работи директно с модела по този начин е лоша идея.

Идеята на проекта, по който работя, е да може да расте с различни бази и микросървиси. Не е монолитен.

  • 4 седмици по-късно...

Според мен е repository.

Дали да имплементираш DI си е твоя работа, не е грешно да не го ползваш, но ако решиш, не трябва да инстанцираш всички обекти едновременно. Инстанцираш on-demand, кешираш, ако ще е singleton и връщаш инстанцията. https://developer.android.com/training/dependency-injection ето това е един добър гайд за DI, превключи на примерите с Java, ако не знаеш Kotlin и прочети първите 2 или 3 страници, другото няма да ти е полезно за Node.

Ако ще държиш някакъв стейт в контролерите, можеш да ги вкараш в класове, иначе няма голям смисъл.

Регистрирайте се или влезете в профила си за да коментирате

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.