一、使用nestx-log4js/core增加日志打印(日志打印更容易分辨,会生成对应的日志文件,默认目录logs)
1.安装nestx-log4js/core
$ yarn add nestx-log4js/core
2.修改app.module.ts
// imports 加入 Log4jsModule
import { Log4jsModule } from "@nestx-log4js/core";
@Module({
imports: [DbModule, UserModule, Log4jsModule.forRoot()],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
3.修改main.ts
// 使用Log4jsLogger
app.useLogger(app.get(Log4jsLogger));
const logger = new Logger("main.ts");
logger.log(`这里是打印`);
效果:
二、nest中间件使用示例(注册密码加密入库)
# 添加加密库
$ yarn add crypto
# 创建hashPassword.middlewarets 中间件
$ nest g mi hashPassword
创建加密方法encryption.ts
import * as crypto from "crypto";
/**
* @description: 加盐
*/
export function addSalt() {
return crypto.randomBytes(3).toString("base64");
}
/**
* @description: 密码加密
* @param {string} userPassword
* @param {string} salt
* @return {*}
*/
export function encrypt(userPassword: string, salt: string): string {
return crypto
.pbkdf2Sync(userPassword, salt, 10000, 16, "sha256")
.toString("base64");
}
hash-password.middleware.ts
import { Injectable, NestMiddleware } from "@nestjs/common";
import { NextFunction } from "express";
import { addSalt, encrypt } from "src/utils/encryption";
@Injectable()
export class HashPasswordMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
let userPassword = req.body["password"];
if (userPassword) {
const salt = addSalt();
userPassword = encrypt(userPassword, salt);
req.body["password"] = userPassword;
req.body["salt"] = salt;
}
next();
}
}
user.moudle.ts 增加方法,指定路由使用中间件
export class UserModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(HashPasswordMiddleware).forRoutes("user/register");
}
}
新增response.interface.ts
/**
* @description: 返回体
* @param {*}
* @return {*}
*/
export interface IResponse {
code: number; // 正常:1 失败: -1
msg: string;
data?: any;
}
修改user.service.ts
import { Injectable, Logger } from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose";
import { Log4jsLogger } from "@nestx-log4js/core";
import { Model } from "mongoose";
import { IResponse } from "src/interfaces/response.interface";
import { User } from "src/interfaces/user.interface";
const logger = new Logger("user.service");
@Injectable()
export class UserService {
private response: IResponse;
constructor(
@InjectModel("USER_MODEL") private readonly userModel: Model<User>
) {}
/**
* @description: 通过用户名查找用户
* @param {string} username
* @return {*}
*/
private async findOneByUsername(username: string) {
return await this.userModel.findOne({
username,
});
}
/**
* @description: 注册方法
* @param {User} user
* @return {*}
*/
public async register(user: User) {
try {
let userInfo = await this.findOneByUsername(user.username);
if (userInfo) {
this.response = { code: -1, msg: "该用户已存在" };
return;
}
const createUser = new this.userModel(user);
await createUser.save();
this.response = { code: 1, msg: "注册成功" };
} catch (error) {
this.response = { code: -1, msg: "注册失败" };
logger.log(error);
} finally {
return this.response;
}
}
}