вызвать / поймать событие, когда вызывается метод конструктора объекта - PullRequest
0 голосов
/ 28 января 2019

Я новичок в Node.js и Mongoose, и я хотел бы вызвать / перехватить событие при запуске конструктора объекта.

IE, я хотел бы отправить электронное письмо, когда персонаж создаетсякак это:

controller.on('characterCreated', (mail, objectCreated) => {
    mailSenderFunction(mail, objectCreated);
});

Я нахожусь в структуре node.js Модель / Сервис / Контроллер с MongoDB и mongoose вот так:

characterModel.js

const mongoose = require('mongoose');
const characterSchema = new mongoose.Schema({
    name: String,
    age: Number,
});

var Character = mongoose.model('Character', characterSchema);

module.exports = Character;

characterService.js

const Character = require('../models/modelCharacter.js');

function create(name, age) {
  return (new Promise((resolve, reject) => {
      const character = new Character();
      character.name = name;
      character.age = age;

      character.save((err) => {
        if (err) {
          reject({ status: 500, error: err });
        } else {
          resolve({ status: 202, data: character });
        }
      });
  }));
}

module.exports = {
    create,
};

characterController.js

const charService = require('../services/characterService');

function create(req, res) {
  if (req.body.name && req.body.age) {
      charService.create(req.body.name, req.body.age);
          .then((result) => {
              res.json(result.data);
              res.status(result.status).end();
          })
          .catch((error) => {
              res.status(result.status).end();
          })
  } else {
      res.status(404).end();
  }
}

module.exports = {
    create,
};

api.js:

const router = require('express').Router();
const characterController = require('./routes/characterController');

router
    .route('/characters')
    .post(characterController.create);

Моя первая идея заключается в следующем:

const EventEmitter = require('events');

const myEmitter = new EventEmitter();
myEmitter.on('myCustomEvent', (mail, data) => {
    mailSenderFunction(mail, objectCreated);
})

и используйте его так:

characterService.js:

...
const character = new Character();
...
character.save((err) => {
...
    myEmitter.emit('myCustomEvent', mail, character);
})
...

Но я видел, что с помощью mongoose мы, вероятно, можем слышать о событиях в базе данных, но я не узналкак.

Есть ли метод мангуста или что-то еще, чтобы сделать это?Спасибо.

1 Ответ

0 голосов
/ 28 января 2019

вы можете использовать pre для отправки почты, например

characterSchema.pre('save', function(next){
    mailSenderFunction(mail, this);
    next();
});

этот код выполняется до .save

, если вам нужно отправить после сохранения, см. https://mongoosejs.com/docs/api.html#schema_Schema-post

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...