首页 > 解决方案 > 调用对象的构造方法时触发/捕获事件

问题描述

我是 Node.js 和 Mongoose 的新手,我想在启动对象构造函数时触发/捕获事件。

IE,我想在这样创建角色时发送电子邮件:

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

我在一个带有 MongoDB 和 mongoose 的 node.js 结构模型/服务/控制器上,如下所示:

characterModel.js

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

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

module.exports = Character;

字符服务.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);
})

并像这样使用它:

字符服务.js:

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

但是我看到通过 mongoose,我们可能可以听到有关数据库事件的信息,但我不知道如何。

有猫鼬方法或其他方法吗?谢谢。

标签: node.jsmongodbeventsmongoose

解决方案


您可以使用 pre 发送您的邮件,例如

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

此代码在 .save 之前执行

如果您需要在保存后发送,请参阅https://mongoosejs.com/docs/api.html#schema_Schema-post


推荐阅读