node.js - 调用对象的构造方法时触发/捕获事件
问题描述
我是 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,我们可能可以听到有关数据库事件的信息,但我不知道如何。
有猫鼬方法或其他方法吗?谢谢。
解决方案
您可以使用 pre 发送您的邮件,例如
characterSchema.pre('save', function(next){
mailSenderFunction(mail, this);
next();
});
此代码在 .save 之前执行
如果您需要在保存后发送,请参阅https://mongoosejs.com/docs/api.html#schema_Schema-post
推荐阅读
- google-apps-script - 如何使用 Google Apps 脚本进行 SUMIF(来自 Google 表格)?
- linux - Matlab 2017a Linux 部署的可执行文件(错误:未定义的函数或变量“matlabrc”)
- python - 测试使用 `FieldList` 和 `FormField` 的 Flask-WTF 表单
- python - Pandas Dataframe 过滤器和 For 循环
- java - 如何在 Kotlin 中编写 Dagger 组件?
- jquery - 当页面从服务器返回验证错误时,Jquery 事件侦听器从选择框更改解除绑定
- python - 网页抓取到 csv 文件只获取第一行
- c++ - 静态或动态链接到容器中运行的二进制文件的 C-Runtime (CRT)?
- c++ - 如何在编译时打印常量值?
- r - 无法将一些 unicode 字符写入文件