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实例,现在一切正常!
我正在使用 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实例,现在一切正常!