在 Node.js 中如何合理的调配某些通用实例对象?(如 Redis)
資深大佬 : chogath 0
一、模块导入的方式:
// redis.ts export const redis = new ioRedis(options); // service.ts import { redis } from './redis' const func1 = async () => { await redis.get('demo') };
二、egg.js app 全局属性:
module.exports.login = function* (ctx) { const {app} = this const form = ctx.request.body let time = 3600 * 24 * 30 //token 过期时间 let token = generateToken({_id: form._id}, time)// 生成 token app.redis.set(form.username, token) // 把 token 存入 redis
三、Nest.js 依赖注入
// redis.ts export const redisProviders = { provide: 'redis', useFactory: async () => { redis = new ioRedis(options); return redis; }, }; @Module({ providers: [redisProviders], exports: [redisProviders], }) export class RedisModule {} // service.ts @Injectable() export class Service { constructor( @Inject('redis') private readonly redis ) {} async func1() { await this.redis.get('demo') } }
个人倾向于第三种,但是在实际的开发中用的是第一种。按另一个例子 logger 实例来说,logger 有 info / error 等方法来记录日志,在全局启动的时候,也需要 logger 实例,这种情况依赖注入的方式反而成为一种限制。
Node.js 后端开发经验有限,请大家指正。
大佬有話說 (3)