#node.js #amazon-s3 #design-patterns #dependency-injection #nestjs
#node.js #amazon-s3 #шаблоны проектирования #внедрение зависимостей #nestjs
Вопрос:
У меня есть приложение NestJS, в котором у меня есть некоторая логика в отношении использования пакетов AWS S3.
У меня есть один модуль, который содержит службу с promiseWrapper
функцией, для преобразования обратного вызова в асинхронный.
private s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
console.log(params)
return new Promise((resolve, reject) => {
this.s3.getSignedUrl(
action,
{
Bucket: params.bucketName,
Key: params.key,
Expires: params.expirationTimeSeconds,
},
(err: any, url: string) => {
if (err) reject(err)
resolve(url)
}
)
})
Нет другого модуля, который должен использовать ту же функцию, поэтому, чтобы не повторять код, я хотел создать глобальную функцию как util
функцию, но для этого мне нужно передать экземпляр в качестве аргумента функции.
private s3PromiseWrapper(action: string, params: S3ParamGetDTO, s3Instance: S3): Promise<string> {
console.log(params)
return new Promise((resolve, reject) => {
s3Instance.getSignedUrl(
action,
{
Bucket: params.bucketName,
Key: params.key,
Expires: params.expirationTimeSeconds,
},
(err: any, url: string) => {
if (err) reject(err)
resolve(url)
}
)
})
Является ли это антишаблоном с точки зрения внедрения зависимостей?
Комментарии:
1. Почему бы просто не использовать
S3.getSignedUrlPromise
метод вместо этого?
Ответ №1:
Вы можете создать оболочку s3 следующим образом
@Injectable({scope: transient})
export class S3Service {
private s3 = null //or just initiate the object;
init() {
this.s3 = new S3();
}
s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
console.log(params)
return new Promise((resolve, reject) => {
this.s3.getSignedUrl(
action,
{
Bucket: params.bucketName,
Key: params.key,
Expires: params.expirationTimeSeconds,
},
(err: any, url: string) => {
if (err) reject(err)
resolve(url)
}
)
})
}
Внедрите ту же службу в любую другую службу
MYService() {
constructor(
private s3: S3Service
) {
this.s3.init()
}
mymethod() {
this.s3.s3PromiseWrapper()
}
}
Тем не менее, напишите оболочку для чего-то еще, что требуется.
javascript aws-sdk уже предоставляет обещанную версию всех методов. доступ к которым можно получить, добавив .promise()
к методам.
например
this.s3.getSignedUrl(params).promise()