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

为什么DigitalOcean Droplet上的Node.js应用API请求返回数据错误?

根因定位

你的报错本质是代码逻辑缺陷+不同环境API响应头差异共同导致的,核心问题如下:

  1. 最关键的错误:你错误使用content-type响应头判断是否需要gzip解压,正确应该读取content-encoding响应头。
    你请求的API返回的gzip压缩标记是放在content-encoding字段里的,AWS和本地环境请求时,可能API返回的content-type刚好附带了gzip关键字,所以逻辑能走通;但DigitalOcean节点请求时,API返回的content-type没有gzip关键字,代码直接走到else分支返回自定义的Data error。
  2. 次要可能原因:DigitalOcean Droplet的IP被目标API限制访问,或者Droplet的出站安全组/防火墙拦截了443端口的请求,导致返回非预期的错误响应。
  3. 依赖版本差异:检查三个环境的Node.js版本、request依赖包版本是否完全一致,低版本依赖可能存在响应头解析差异。
修复代码

修改requestWithEncoding函数里的判断逻辑即可:

const requestWithEncoding = (options, callback) => {
    const req = request.get(options)

    req.on('response', res => {
        // 临时打印完整响应头,方便排查不同环境的差异
        console.log('Response headers: ', res.headers)
        var chunks = []
        res.on('data', chunk => {
            chunks.push(chunk)
        })

        res.on('end', () => {
            const buffer = Buffer.concat(chunks)
            // 改为读取content-encoding头判断压缩格式
            const contentEncoding = res.headers['content-encoding'] || ''

            if(contentEncoding.includes('gzip')){
                zlib.gunzip(buffer, (err, decoded) => {
                    callback(err, decoded && decoded.toString())
                })
            } else if(contentEncoding.includes('deflate')) {
                // 补充处理你之前遗漏的deflate压缩场景
                zlib.inflateRaw(buffer, (err, decoded) => {
                    callback(err, decoded && decoded.toString())
                })
            } else {
                // 临时打印原始内容,确认是否返回了错误提示页
                console.log('Raw response content: ', buffer.toString())
                callback(null, buffer.toString())
            }
        })
    })

    req.on('error', err => {
        callback(err)
    })
}
额外排查步骤
  • 登录DigitalOcean Droplet,直接执行curl命令测试API连通性:curl -v "https://api.smarkets.com/oddsfeed.xml.gz?affiliate_key=替换成你的API_KEY&event_type=football-single_event",确认返回状态码是200,且响应头里content-encoding为gzip
  • 如果curl返回403/404等错误,说明是IP被限制或者API地址拼接错误,和代码无关
  • 确认Droplet的出站安全组规则没有限制443端口的对外访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:18:00