【发布时间】:2021-04-15 12:12:16
【问题描述】:
我正在尝试使用 Nodejs eventEmitters 为我的 nodejs/express API 项目创建发布者-订阅者模式。我的用例相当简单:
- 我想从项目中的不同位置发出事件。例如,在创建新用户时发出事件。
- 然后我想要一个地方,在那里我可以监听所有事件并决定采取什么行动。
这将需要 eventEmitter 的单例实例,因为 'emit' 和 'on' 调用应该发生在 'event' 对象的同一个实例上。
为了实现它,这就是我的 index.js 的外观:
const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const routes = require('./api/routes')
const EventEmitter = require("events");
const eventEmitter = new EventEmitter();
const eventListeners = require('../src/subscribers/events');
//const eventSubs = new eventListeners();
app.use(eventListeners.eventSubscribers());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('eventEmitter', eventEmitter);
app.get('/', (req, res) => res.send('App is working'))
app.use('/api', routes)
app.listen(3000, () => console.log('Example app listening on port 3000!'))
module.exports = {
app
}
这就是我的中间件/控制器函数的样子(我在哪里发出事件):
const createUser = async (req, res, next) => {
var user = req.body
try {
console.log('in controller');
await newUser(user)
console.log(req.app.get('eventEmitter'));
req.app.get('eventEmitter').emit('USER_CREATED', {email: user.email, name: user.name})
res.status(200).send({success: true});
next()
} catch(e) {
console.log(e.message)
res.sendStatus(500) && next(e)
}
}
而且,这就是我的 事件订阅者 文件的外观:
const eventSubscribers = (req) => {
const eventEmitter = req.app.get('eventEmitter');
eventEmitter.on('USER_CREATED', ({ email, name }) => {
console.log('event fired and captured')
})
}
使用这个,事件被发出,但事件订阅者没有被触发。我认为我在订阅者中访问 req/app 对象的方式有问题。另外,我得到了
TypeError: eventListeners.eventSubscribers is not a function
我的 index.js 文件中的错误。我的问题:
- 这是创建发布者/订阅者模式的正确方法吗?
- 如何在我的事件订阅者中访问 req/app 对象实例?
- 确保在应用加载时加载事件订阅者文件的最佳方法是什么?
【问题讨论】:
-
EventEmitter 应按如下方式导入:
const { EventEmitter } = require ('events');。事件模块有其他类和属性,现在你没有按预期导入它。
标签: javascript node.js express eventemitter