随着程序的增长,日志记录成为跟踪所有内容的关键部分。它对于调试目的尤为重要。
现在已经有了 npm 的日志记录模块。这些模块可以将日志存储在不同格式或级别的文件中。我们将使用流行的ORM Mongoose 讨论 Node.js Express 程序中的 api 日志记录。
那么如何创建一个 Mongoose 插件,以更清洁的方式为你进行记录并简化 API 日志?
在 Mongoose 中,模式是可插入的。插件就像一个函数,你可以在模式中使用它,并在模式实例上一次次地重用。
Mongoose 还提供全局插件,你可以将其用于所有模式。例如我们将会编写一个插件,它将创建两个 jsons的diff 并写入 mongodb。
让我们创建一个具有以下六个属性的基本日志模式:
如果你希望对自己的应用程序有意义,可以添加更多字段,也可以根据需要更改和升级架构。
这是我们的模型:models/log.js
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const { ObjectId } = Schema
const LogSchema = new Schema({
action: { type: String, required: true },
category: { type: String, required: true },
createdBy: { type: ObjectId, ref: 'Account', required: true },
message: { type: String, required: true },
diff: { type: Schema.Types.Mixed },
},{
timestamps: { createdAt: 'createdAt', updatedAt: 'updatedAt' },
})
LogSchema.index({ action: 1, category: 1 })
module.exports = mongoose.model('Log', LogSchema)
所以下一步是你需要一个可重用的函数,它将动态创建两个 JSON 的 diff。
我们称之为 diff.js
const _ = require('lodash')
exports.getDiff = (curr, prev) => {
function changes(object, base) {
return _.transform(object, (result, value, key) => {
if (!_.isEqual(value, base[key]))
result[key] = (_.isObject(value) && _.isObject(base[key])) ? changes(value, base[key]) : value
})
}
return changes(curr, prev)
}
我使用了 lodash,这是一个提供相同功能的受欢迎的库。
让我们分解上面的函数,看看发生了什么:
isEqual:此方法支持比较数组、数组缓冲区、布尔值、日期对象、错误对象、映射、数字、对象、正则表达式、集合、字符串、符号和类型化数组。对象通过它们自己的方法比较,而不是通过继承的、可枚举的属性进行比较。函数和 dom 节点则进行严格相等的比较,即使用 ===。
这里我们迭代每个对象的属性和值,并将它与旧对象进行比较。
如果当前对象的 value 不等于前一个对象中相同属性的值:base[key] 如果该值是对象本身,我们递归调用函数changes直到它得到一个值,它最终将作为 result[key]=value 存储在 result 中。
现在我们需要跟踪数据库中的前一个 document 并在保存到 mongodb 之前创建一个 diff。
const _ = require('lodash')
const LogSchema = require('../models/log')
const { getDiff } = require('../utils/diff')
const plugin = function (schema) {
schema.post('init', doc => {
doc._original = doc.toObject({transform: false})
})
schema.pre('save', function (next) {
if (this.isNew) {
next()
}else {
this._diff = getDiff(this, this._original)
next()
}
})
schema.methods.log = function (data) {
data.diff = {
before: this._original,
after: this._diff,
}
return LogSchema.create(data)
}
}
module.exports = plugin
在 Mongoose 中,有不同的钩子可用。现在我们需要使用架构上可用的 init 和 save 方法。
this.isNew():如果你正在创建新文档,那么只需返回 next()中间件。
在 schema.post('init') 的 toObject()中:
doc._original = doc.toObject({transform: false})
Mongoose Model 继承自 document,它有一个 toObject() 方法。它将 document 转换为 Object()和transform:false是为了不允许转换返回对象。
在你的主server.js或app.js中:
初始化全局 plugin 以便它可用于所有模式。你还可以通过在架构模型中初始化它来将其用于特定架构。
const mongoose = require('mongoose')
mongoose.plugin(require('./app/utils/diff-plugin'))
这是 user 更新 API 的基本示例:
const User = require('../models/user')
exports.updateUser = (req, res, next) => {
return User.findById(req.params.id)
.then(user => {
if (!user)
throw new Error('Target user does not exist. Failed to update.')
const { name } = req.body
if (name) user.name = name
return user.save()
})
.then(result => {
res.json(result)
return result
})
.catch(next)
.then(user => {
if (user && typeof user.log === 'function') {
const data = {
action: 'update-user',
category: 'users',
createdBy: req.user.id,
message: 'Updated user name',
}
return user.log(data)
}
}).catch(err => {
console.log('Caught error while logging: ', err)
})
}
在本教程中,你学习了如何创建 Mongoose 插件并用它来记录 API 中的 changes。你可以使用插件执行更多操作来构建健壮的 Node.js 程序。
原文:https://www.freecodecamp.org/news/how-to-log-a-node-js-api-in-an-express-js-app-with-mongoose-plugins-efe32717b59/
作者:Shailesh Shekhawat
翻译:疯狂的技术宅
在前端应用越来复杂的今天,为了监控前端应用是否正常运行,通常会在前端收集一些错误与性能等数据,最终我们会将这些数据上报到服务端。上报的方式有很多,理论上我们只要能把数据发给服务端就行了
如果想统计网站的访问来源信息,可以用 php 获取信息,记录到数据库的形式,也可以直接使用 nginx 提供的访问日志,来记录网站的访问详情,管理员可以通过分析 nginx 的访问日志,来分析用户的访问来源,访问行为详情
日志记录是每个开发人员从第一天编写代码时就要做的事情,但很少有人知道它可以产生的价值和最佳实践。在本文中,我们将讨论以下主题:什么是日志,为什么很重要性?
平常都使用console来打印 node 脚本执行时需要看到的信息,但这些信息也就只能在控制台查看。假如你希望将打印的信息记录到文件查看的话,那就往下看看吧。使用 node.js 对日志进行存储,就一定会对本地文件的增删改查,那么我们需要用到fs。
通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单介绍一下。
在项目中,我们会频繁用到 console.log() 来输出一些关键信息到控制台中,有助于开发调试,以及问题的排查,待项目上线后,这些调试日志又得及时清除。
nodeJs 自己的log 输出一堆讯息,要从这么多又杂的讯息中找出问题,是件非常辛苦的事情。log4js 是一款基于Node 环境下较好用的log 模组,本篇简单介绍log4js 的使用方式。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!