使用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
相关产品推荐
相关产品推荐

