Minio InvalidEndpointError求助:跨主机NodeJS上传失败排查
问题描述
我在192.168.200.xx1主机通过Docker部署Minio,启动命令为:
docker run --name minio_server --hostname minio -d -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"
另一台192.168.200.xx2主机的NodeJS代码尝试向该Minio上传数据,代码如下:
async function uploadImage(req, res) { const path = await image_functions_1.ImageLoad.urlCreate(userId, surveyId) + "/" + req.file.originalname; return res.status(200).json({ success: false, message: "Failed to upload!" }); let minioClient = new Minio.Client({ endPoint: process.env.MINIO_END_POINT, port: 9000, useSSL: false, accessKey: process.env.MINIO_ACCESS_KEY, secketKey: process.env.MINIO_SECRET_KEY }); minioClient.putObject(process.env.MINIO_BUCKET, path, req.file.buffer, function (err, etag) { if (err) { return console.log(err); } }); }
上传时出现错误:
(node:14441) UnhandledPromiseRejectionWarning: InvalidEndpointError: Invalid endPoint : http://192.168.200.xx1 at new Client (/home/moxem/backend/node_modules/minio/dist/main/minio.js:102:13) at uploadImage (/home/moxem/backend/dist/api/Media/image_crud.js:34:23) at processTicksAndRejections (internal/process/task_queues.js:97:5)
.env文件中MINIO_END_POINT值为MINIO_END_POINT=http://192.168.xxx.xx1,也曾尝试改为MINIO_END_POINT=minio://192.168.200.xx1,仍报错。已在Minio主机执行sudo ufw allow 9000开放端口,请问哪里操作有误?
错误分析与修正方案
1. Minio客户端endPoint参数格式错误
Minio NodeJS客户端的endPoint只需要填写纯IP地址或域名,不能带http://、minio://这类协议前缀。
- 修正
.env文件:MINIO_END_POINT=192.168.200.xx1
2. 代码存在拼写错误
代码中secketKey是拼写错误,正确的参数名是secretKey,这个错误会导致客户端无法正确认证,后续上传也会失败。
- 修正客户端初始化代码:
let minioClient = new Minio.Client({ endPoint: process.env.MINIO_END_POINT, port: 9000, useSSL: false, accessKey: process.env.MINIO_ACCESS_KEY, secretKey: process.env.MINIO_SECRET_KEY // 修正拼写 });
3. 代码提前返回导致后续逻辑未执行
在创建Minio客户端之前,你写了return res.status(200).json({ success: false, message: "Failed to upload!" });,这会直接终止函数执行,后面的Minio客户端初始化和上传代码根本不会运行。
- 移除这行错误的提前返回,或者调整逻辑为错误时再返回:
async function uploadImage(req, res) { const path = await image_functions_1.ImageLoad.urlCreate(userId, surveyId) + "/" + req.file.originalname; let minioClient = new Minio.Client({ endPoint: process.env.MINIO_END_POINT, port: 9000, useSSL: false, accessKey: process.env.MINIO_ACCESS_KEY, secretKey: process.env.MINIO_SECRET_KEY }); minioClient.putObject(process.env.MINIO_BUCKET, path, req.file.buffer, function (err, etag) { if (err) { console.log(err); return res.status(500).json({ success: false, message: "Failed to upload!" }); } return res.status(200).json({ success: true, message: "Upload successful!", etag: etag }); }); }
额外检查点
- 确认Minio容器正常运行:执行
docker ps查看minio_server容器状态是否为Up - 确认
192.168.200.xx2能ping通192.168.200.xx1,且能通过telnet 192.168.200.xx1 9000测试端口连通性 - 确认
.env文件中的MINIO_ACCESS_KEY和MINIO_SECRET_KEY与Minio服务器配置一致(默认Minio启动未指定的话会生成随机密钥,可通过容器日志查看,或启动时通过MINIO_ROOT_USER和MINIO_ROOT_PASSWORD参数指定)
内容的提问来源于stack exchange,提问作者GecKo
相关产品推荐
相关产品推荐

