首页 > 解决方案 > 带有生命周期钩子的事件驱动 NodeJS 应用程序架构

问题描述

我有一个关于开发具有自己的生命周期和事件以在全球范围内跟踪服务器活动的 Nodejs 应用程序的一般性问题。

我需要什么?

任何

背景

已经开发了一个带有数据库、身份验证和文件上传的后端。我做得非常务实,而且效果很好。但是现在我想开发一个新的更好的架构,它是事件驱动的来跟踪活动和生命周期挂钩到初始化模块。

我正在研究 Libs,这似乎很棒,但我需要知道我是否走对了路。

这是最近的后端,我想从核心更新:

@fractools/节点

目标

节点需要更加抽象和事件驱动,以便更全局地跟踪漏洞过程的活动。

我在考虑一个核心模块,它定义了事件和挂钩的基础,这些事件和钩子监听了孔应​​用程序过程。

所以其他模块,如数据库处理,或身份验证等可以被包装到它上面。

我的问题

我怎样才能有一个像活动记录器这样的助手,它通过洞应用程序进行监听,所以我不需要在每个操作中都导入记录器?可能吗?这有道理吗?

示例案例

核心模块跟踪数据库活动:

系统将数据放入数据库,核心监听它,跟踪它并将此信息推送到使用数据库的记录器中。

问题

例如,我坚持一个简单的架构问题:

如果我有一个数据库类,并且我希望 Core(它是一个扩展的 EventErmitter)来监听数据库操作,我不能在使用数据库的 Core 内部有一个记录器,因为我不能一次将这些模块相互引用:

// Core Module

const EventErmitter = require('events');
const Database = require('./database)';

module.exports = class Core extends EventEmitter {
  constructor() {
    super();

    this.logger = new Database('Logger');

    this.on('mounted', () => {
      this.logger.put('instance mounted')
    });

    this.on('putData', () => {
      this.logger.put('dataPut')
    });

    this.emit('mounted');
  }
}

// Database Module
const Core = require('./core');
const PouchDB = require('pouchdb'); // Which database lib to use is not important yet

let core = new Core();

module.exports = class Database {
  constructor(name, options) {

    this.id = generateID();
    this.name = name;
    this.created = JSON.stringify(new Date()); // TODO doubled Quotes

    this.options = options || {};

    this.db = new PouchDB(name);
    core.emits('mounted')
  }
  put(data) {
    this.db.put(data);
    core.emits('dataPut')    
  }
}

所以我注意到,我需要任何起点。:秒

我查看NodeJS EventErmitter并发现 NodeJS 进程也在 EventErmitter 上。

我还查看了几个用于 NodeJS 生命周期事件的 Tuts,但无论如何它并不能真正帮助启动架构。

我希望你们中的一些人有很好的参考资料或“蓝图”,这有助于我为我的节点开发一个好的核心。:)

到目前为止,祝您度过愉快的一天,并保持安全!

问候

标签: javascriptnode.jseventsarchitecture

解决方案


推荐阅读