Nestjs中的socket挂起,用于使用minio客户端上传文件

Socket hang up in Nestjs for uploading files with minio client

我正在使用 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作为客户端,但是使用容器一段时间后出现同样的问题

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

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