首页 > 解决方案 > Nestjs中的套接字挂起用于使用minio客户端上传文件

问题描述

我正在使用nestjs-minio-client将文件上传到我的minio存储。

我的应用程序在 Nginx 后面的 docker 容器上作为反向代理运行。

minio 存储在另一个服务器上的另一个 docker 容器上。

上传过程正常,文件正确上传到存储。但问题是,过了一会儿,除非我重新启动容器,否则无法上传更多文件。

这是由于套接字挂起

   [Nest] 20   - 11/29/2020, 12:36:57 PM   [ExceptionsHandler] socket hang up +899287ms
Error: socket hang up
    at connResetException (internal/errors.js:609:14)
    at TLSSocket.socketOnEnd (_http_client.js:459:23)
    at TLSSocket.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1223:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)

这是我的实现:

我在我的模块中导入了 minioModule:

import { MinioModule } from 'nestjs-minio-client';

@Module({
         imports: [ MinioModule.register({
                                    endPoint: minioConstants.MINIO_ENDPOINT,
                                    useSSL: true,
                                    accessKey: minioConstants.MINIO_ACCESSKEY,
                                    secretKey: minioConstants.MINIO_SECRETKEY,})],
          
         controllers: [...],
         providers: [...],
         exports: [...]

这就是我在控制器中传递文件的方式(使用 multer):

    @Put('/avatar')
    @UseInterceptors(FileInterceptor('avatar'))
    async uploadAvatar(
        @UploadedFile() avatarFile: IMulterFile
    ){
        return {data: await this.uploadService.uploadImage(avatarFile)}
    }

上传服务来了:

import { Injectable, Logger, HttpException, HttpStatus } from '@nestjs/common';
import { MinioService } from 'nestjs-minio-client';
import * as crypto from 'crypto'
import { IMulterFile } from '@shared/interfaces/file.interface';

@Injectable()
export class UploadService {
    private readonly baseBucket = 'users' //fix ==> read from env

    public get client() {
      return this.minio.client;
    }

    constructor(private readonly minio: MinioService) {}

    public async uploadImage(file: IMulterFile, baseBucket: string = this.baseBucket) {
      if(!(file.mimetype.includes('image/jpeg') || file.mimetype.includes('image/png'))) {
        throw new HttpException('Error uploading file', HttpStatus.BAD_REQUEST)
      }
      let temp_filename = Date.now().toString()
      let hashedFileName = crypto.createHash('md5').update(temp_filename).digest("hex");
      let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
      const metaData = {
        'Content-Type': file.mimetype,
        'X-Amz-Meta-Testing': 1234,
      };
      let filename = hashedFileName + ext
      const fileName: string = `${filename}`;
      const fileBuffer = file.buffer;
      await this.client.putObject(baseBucket,fileName,fileBuffer,metaData)

    return {filename}
  }

  async delete(objetName: string, baseBucket: string = this.baseBucket) {
    await this.client.removeObject(baseBucket, objetName);
  }
}

我也尝试过将nestjs-minio作为客户端,但是在使用容器一段时间后会出现同样的问题。

关于为什么会发生这种情况以及如何解决它有什么想法吗?

标签: node.jsdockernestjsminio

解决方案


这很奇怪,但问题出在 minio 服务器本身!我用 minio playground 尝试了代码,它运行良好!所以我们再次设置了最新版本的 minio 实例,现在一切都很好!


推荐阅读