Appearance
基础功能
⭐⭐⭐⭐⭐
列举了一些基础功能的用法。
数据缓存
将一些经常使用的数据存于内存中,可以提升接口的响应速度。Nest 为各种缓存存储提供程序提供了统一的 API,这里使用的是 cache-manager,在 modules/system/cache 中封装了一个缓存模块。
ts
// 引入
import { CacheService } from 'src/modules/system/cache/cache.service'
export class TestService {
// 注册
constructor(
private readonly cacheService: CacheService
) {}
async fnCache() {
// 设置
await this.cacheService.set('cacheName', value, { ttl: 0 })
// 使用
const value = await this.cacheService.get('value')
// 删除
await this.cacheService.del('cacheName')
}
}DANGER
ttl 单位为秒,不传默认为1小时,0代表永久有效
参考链接:高速缓存
定时任务
定时任务允许你按照指定的日期/时间、一定时间间隔或者一定时间后单次执行来调度(scheduling)任意代码。在 Node.js 应用中,有几个不同的包可以模拟 cron 包的功能。Nest 提供了 @nestjs/schedule 包,其集成了流行的 Node.js 的 node-cron 包。
ts
import { Cron, CronExpression } from '@nestjs/schedule'
// 北京时间每天0点自动执行一次
@Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT, {
timeZone: 'Asia/Shanghai'
})
// 每分钟的第45秒执行一次
@Cron('45 * * * * *')参考链接:定时任务
邮件服务
邮件服务使用了 nodemailer 和 @nestjs-modules/mailer 包,在 modules/system/email 中注册了邮件服务,相关配置可以在 email.module.ts 中修改。
ts
import { ISendMailOptions, MailerService } from '@nestjs-modules/mailer'
export class TestService {
constructor(
private readonly mailerService: MailerService
) {}
// 注册获取邮箱验证码
async sendEmailCodeByRegister(sendEmailCodeDTO: BlogCommonSendEmailCodeDTO) {
const hasEmail = await this.memberRepository.findOneBy({ email: sendEmailCodeDTO.email })
if (hasEmail) {
throw new InternalServerErrorException('该邮箱已注册')
}
try {
const code = Math.random().toString().slice(-4)
const sendEmailDTO = new BlogCommonSendEmailDTO()
sendEmailDTO.email = sendEmailCodeDTO.email
sendEmailDTO.code = code
sendEmailDTO.subject = '用户注册邮箱验证'
sendEmailDTO.describe = '您正在进行理想三旬个人博客的注册验证'
await this.sendEmailCode(sendEmailDTO)
} catch (error) {
throw new InternalServerErrorException(error)
}
}
// 发送邮件
async sendEmailCode(sendEmailDTO: BlogCommonSendEmailDTO) {
try {
const sendMailOptions: ISendMailOptions = {
to: sendEmailDTO.email, // 收件人邮箱
subject: sendEmailDTO.subject || '用户邮箱验证', // 邮件标题
template: 'email.code.ejs', // 模板文件名
context: {
code: sendEmailDTO.code, // 验证码
describe: sendEmailDTO.describe, // 描述
expirationTime: sendEmailDTO.expirationTime || 5, // 过期时间(分钟)
sign: sendEmailDTO.sign || '系统邮件,回复无效' // 签名
}
}
await this.mailerService.sendMail(sendMailOptions)
// 同时在缓存中新增一条记录
await this.cacheService.set(sendEmailDTO.email, sendEmailDTO.code, { ttl: 60 * 5 }) // 单位:秒
return true
} catch (error) {
throw new InternalServerErrorException(error)
}
}
}