Node.js 在Express Nodejs中记录用户活动

Node.js 在Express Nodejs中记录用户活动,node.js,express,user-activity,Node.js,Express,User Activity,我有一个带有express的后端api。我已经用winston和morgan实现了日志记录 我的下一个要求是将用户的活动记录到数据库MySQL中:时间戳、用户以及他获取或更改的内容。我在网上搜索找到了。但既然还没有答案,我就来了 我的想法: 我可以在我的路由处理程序中添加另一个查询,在我响应客户机之前插入上面提到的所有信息。但我很好奇是否还有其他方法可以完美地实现它。从以下案例中选择适合您的系统的最佳方法 根据用例决定您的活动日志应该是持久的还是内存中的。让我们假设持久性数据库是mySQL 如果

我有一个带有express的后端api。我已经用
winston
morgan
实现了日志记录

我的下一个要求是将用户的活动记录到数据库MySQL中:时间戳、用户以及他获取或更改的内容。我在网上搜索找到了。但既然还没有答案,我就来了

我的想法:
我可以在我的路由处理程序中添加另一个查询,在我响应客户机之前插入上面提到的所有信息。但我很好奇是否还有其他方法可以完美地实现它。

从以下案例中选择适合您的系统的最佳方法

根据用例决定您的活动日志应该是持久的还是内存中的。让我们假设持久性数据库是mySQL

如果您的数据已经是DB,那么就没有必要再次存储所有数据,您可以只为执行CRUD的行存储主要用于标识的密钥/ID。若在活动表中执行的操作始终是固定的或序列化的JSON,则可以将其存储为外键。 例如,结构可以如下所示,其中
activity\u data
是序列化的JSON值

ID | activity_name | activity_data | start_date | end_date | 

如果在再次收集数据时有巨大的挣扎,在发送响应之前存储活动结束时,您可以考虑将活动函数应用于为MySQL创建的数据库抽象层或包装模块(假设)。 例如:

try {
    await query(`SELECT * FROM products`);
    //performActivity(insertion)
}catch{
    //performErrorActivity(insertion)
}

这里,我们需要考虑性能上的一个小折衷,因为我们在每一步都执行插入操作。

如果我们想一次完成这一切,我们需要维护一个集合,将所有活动的引用添加到类似于
request.activityPayload
的内容中,或者可能是一个缓存,最后执行插入


如果您正在考虑专门为活动添加一个新的数据源,强烈建议使用非关系数据库来存储/转储此类数据(MongoDB自以为是)。这是因为与关系数据库相比,它不关注模式结构。与mySQL相比,特别是在活动存储方面,您可以获得性能优势。

谢谢您的回答。对我正在使用Node和MySQL。无论出于何种原因,都不能使用NoSQL。我可以在
中间件
中写入这些代码吗?可以,请确保在
请求中的任何键中收集所有数据。activityPayload
并在末尾附加一个中间件,该中间件将插入此数据并发送响应。我还认为,如果插入操作不是那么依赖,那么您可以保持它的异步,同时让您的响应继续进行(如果合适的话)。非常感谢。@bron10使用事件怎么样?您可以发出一个事件,并将负载对象和所有数据传递给事件,并且有一个中心事件侦听器,可以保存数据库中的所有活动。确保传递数据的模式可以是包装函数的一些单例方法,也可以是您建议的事件。除非是作者,否则我不喜欢异步执行,并且愿意维护回调,而我现在通常不喜欢这样做,除非处理的是核心节点模块。似乎我对此很固执己见:),但简而言之,是的,这是一个很好的方法。它将帮助作者将保存活动作为一项单独的服务进行维护。