You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署到DigitalOcean后遇CredentialsError及404问题求助

解决Node.js部署到DigitalOcean后上传Spaces的CredentialsError与404问题

本地运行正常但部署后出现CredentialsError和404,核心原因是部署环境没有正确加载DigitalOcean Spaces的凭证配置,或是代码存在小问题导致请求失败。下面是具体解决步骤:

1. 强制AWS SDK加载配置文件

报错提示明确提到if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1,需要在部署环境中设置这个环境变量:

  • DigitalOcean App Platform:进入应用的「Settings」→「Environment Variables」,新增变量AWS_SDK_LOAD_CONFIG=1
  • Droplet服务器:启动应用前执行export AWS_SDK_LOAD_CONFIG=1,或把这条命令写入.bashrc/.profile实现永久生效;也可以直接在启动命令前拼接变量:AWS_SDK_LOAD_CONFIG=1 node app.js

2. 检查.aws文件夹的位置与权限

  • 确保.aws文件夹放在应用的运行目录下,或服务器当前用户的主目录(比如/home/your-user/.aws),保证应用进程能访问到
  • 修正文件夹和文件权限,避免权限过宽导致SDK拒绝读取:
    chmod 700 ~/.aws
    chmod 600 ~/.aws/credentials
    
    同时确认应用进程的用户拥有读取该文件夹的权限

3. 改用环境变量传递凭证(更安全可靠)

依赖.aws文件夹容易出现路径或权限问题,推荐直接用环境变量传递凭证:
修改S3实例初始化代码,从环境变量读取密钥:

const s3 = new aws.S3({
  endpoint: spacesEndpoint,
  accessKeyId: process.env.SPACES_ACCESS_KEY,
  secretAccessKey: process.env.SPACES_SECRET_KEY
});

然后在部署环境添加两个环境变量:

  • SPACES_ACCESS_KEY:你的DigitalOcean Spaces访问密钥
  • SPACES_SECRET_KEY:你的DigitalOcean Spaces秘密密钥

4. 修正代码中的参数错误

原代码里multer-s3的key函数参数写错了:.single("image")对应单个文件,参数应该是file而非files,这个错误也会导致上传失败。

5. 排查404的额外可能

如果凭证问题解决后仍有404,检查:

  • 确认bucket: 'imagebr'是你在DigitalOcean Spaces中创建的正确桶名,且桶的区域与nyc3.digitaloceanspaces.com匹配
  • 检查桶的权限设置,确保你的密钥对拥有Spaces的读写权限(在DO控制面板中给密钥分配对应权限)

修改后的完整代码示例

const aws = require('aws-sdk');
const express = require('express');
const multer = require('multer');
const multerS3 = require('multer-s3');

const app = express();
const spacesEndpoint = new aws.Endpoint('nyc3.digitaloceanspaces.com');
const s3 = new aws.S3({
  endpoint: spacesEndpoint,
  // 从环境变量读取凭证
  accessKeyId: process.env.SPACES_ACCESS_KEY,
  secretAccessKey: process.env.SPACES_SECRET_KEY
});

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'imagebr',
    acl: 'public-read',
    key: function (request, file, cb) {
      cb(null, file.originalname);
    }
  })
}).single("image");

app.use(express.static('public'));

app.post('/uploads', upload, (req, res) => {
  res.send('uploaded');
})

const port = process.env.PORT || 3001;
app.listen(port, function () {
  console.log(`Server listening on port ${port}.`);
});

内容的提问来源于stack exchange,提问作者Mathomania

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:45:37