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

使用Node+Express上传文件至DO Spaces时遭遇403 Forbidden问题求助

解决Node + Express上传文件到DigitalOcean Spaces时的403 Forbidden(UserSuspended)问题

问题背景

我正在用Node.js + Express搭建文件上传功能,目标存储是DigitalOcean Spaces,但每次尝试上传都会返回403 Forbidden错误,错误日志里明确标记了code: 'UserSuspended'。

我的上传代码

const aws = require('aws-sdk')
const multer = require('multer')
const multerS3 = require('multer-s3')
const space_ep = new aws.Endpoint('nyc3.digitaloceanspaces.com')
const s3 = new aws.S3({
  endpoint: space_ep,
  accessKeyId: 'my-access-key',
  secretAccessKey: 'my-secret-access-key'
})
const uploader = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'my-bucket',
    acl: 'public-read',
    key: function(request, file, cb) {
      console.log(file)
      cb(null, file.originalname)
    }
  })
}).array('upload', 1)
export function upload(req, res, next) {
  uploader(req, res, function(error) {
    if (error) {
      console.log(error)
      return res.redirect('/error')
    }
    console.log('upload success')
    response.redirect('/success') // 这里注意:应该是res而非response
  })
}
...
let router = require('express').Router()
router.post('/upload', upload)

控制台错误日志

{
  UserSuspended: null,
  at Request.extractError (path\node_modules\aws-sdk\lib\services\s3.js:831:35),
  at Request.callListeners (path\node_modules\aws-sdk\lib\sequential_executor.js:106:20),
  at Request.emit (path\node_modules\aws-sdk\lib\sequential_executor.js:78:10),
  at Request.emit (path\node_modules\aws-sdk\lib\request.js:683:14),
  at Request.transition (path\node_modules\aws-sdk\lib\request.js:22:10),
  at AcceptorStateMachine.runTo (path\node_modules\aws-sdk\lib\state_machine.js:14:12),
  at path\node_modules\aws-sdk\lib\state_machine.js:26:10,
  at Request.<anonymous> (path\node_modules\aws-sdk\lib\request.js:38:9),
  at Request.<anonymous> (path\node_modules\aws-sdk\lib\request.js:685:12),
  at Request.callListeners (path\node_modules\aws-sdk\lib\sequential_executor.js:116:18),
  message: null,
  code: 'UserSuspended',
  region: null,
  time: 2020-05-30T07:00:19.383Z,
  requestId: 'tx000000000000011987442-005ed20482-21a2fa-nyc3b',
  extendedRequestId: undefined,
  cfId: undefined,
  statusCode: 403,
  retryable: false,
  retryDelay: 17.163587715908,
  storageErrors: []
}

问题原因分析

从错误代码UserSuspended可以直接判断,这不是代码逻辑问题,而是和你的DigitalOcean账号状态、Spaces访问凭证的有效性或权限直接相关。这个错误表示请求使用的凭证对应的用户(或账号)处于暂停状态,无法正常访问Spaces服务。

解决步骤

1. 检查DigitalOcean账号状态

首先登录你的DigitalOcean后台,查看账号是否有异常:

  • 检查是否有欠费提醒,账号欠费会导致所有服务暂停
  • 查看账号是否有违规通知,违规操作可能导致账号被临时限制

2. 验证Spaces访问凭证的有效性

进入DigitalOcean控制台的Spaces页面,找到目标Bucket,然后:

  • 进入Settings -> API Keys,核对代码里的accessKeyId和secretAccessKey是否完全匹配,注意不要有空格或拼写错误
  • 确认该API Key的权限:确保它被分配了Spaces Read/Write权限(如果只是上传,至少需要Write权限),权限不足也会触发类似的403错误
  • 如果凭证不确定,建议直接生成新的API Key替换旧的,避免旧凭证失效

3. 确认Bucket的配置正确性

  • 检查Bucket的区域是否和代码里的endpoint一致:比如你的Bucket如果是在纽约3区(nyc3),那么nyc3.digitaloceanspaces.com是对的;如果Bucket在其他区域(如新加坡sgp1),需要修改对应的endpoint
  • 检查Bucket的ACL设置:代码里设置了acl: 'public-read',确保Bucket的默认权限允许设置公共读的对象,或者你的API Key有权限设置对象的ACL

4. 修正代码里的小疏漏

你的代码最后有个小bug:response.redirect('/success')应该改为res.redirect('/success'),这个虽然不是导致403的原因,但会在上传成功后抛出错误,建议一并修正。

总结

优先排查账号状态和凭证有效性,这是UserSuspended错误的核心原因。代码本身的上传逻辑是没问题的,只要解决了账号/凭证的问题,应该就能正常上传了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:32:47