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

部署到Heroku的Node.js应用无法访问数据库,请求返回503错误

Node.js应用本地正常,部署到Heroku后/getUsers接口返回503且前端JSON解析错误

我的Node.js应用在本地运行完全正常,但部署到Heroku平台后,执行数据查询时出现异常:请求https://cadfi.herokuapp.com/getUsers返回**503 (Service Unavailable)**错误,前端同时抛出SyntaxError,提示返回内容不是有效JSON。

前端retrieve.ejs中的sendData函数代码

function sendData(e){
    if (e.value !== "total") {
        const searchResults = document.getElementById('searchResults');
        fetch('getUsers',{
            method: 'POST',
            headers: {'content-type': 'application/json'},
            body: JSON.stringify({payload: e.value})
        }).then(res => res.json()).then(data => {
            let payload = data.payload;
            searchResults.innerHTML = '';
            if (payload.length < 1){
                searchResults.innerHTML = '<p>Nome não encontrado</p>';
                return;
            }
            payload.forEach((item,index)=>{
                if (index <0) searchResults.innerHTML += '<hr>';
                searchResults.innerHTML += `<p>${item.firstName} ${item.lastName} .. Total de dívidas R$ ${item.dividaUm+item.dividaDois}.</p>`;
            });
                return;
        });
    } else {
        const searchResults = document.getElementById('searchResults');
        fetch('getTotalDivida',{
            method: 'POST',
            headers: {'content-type': 'application/json'},
            body: JSON.stringify({payload: e.value})
        }).then(res => res.json()).then(data => {
            let payload = data.payload;
            searchResults.innerHTML = '';
            if (payload.length < 1){
                searchResults.innerHTML = '<p>Nome não encontrado</p>';
                return;
            }
            const total = payload.reduce((acc, obj) =>{
                return acc + obj.dividaUm + obj.dividaDois
            },0);
            searchResults.innerHTML += `<p>Total de dívidas R$ ${total}.</p>`

        });
    }
}

后端服务器/getUsers接口代码

app.post('/getUsers', async (req, res) =>{
    let payload = req.body.payload.trim();
    let search = await User.find({firstName: {$regex: new RegExp('^'+payload+'.*','i')}}).exec();
    //console.log(payload)

    //limitar resultados a 10
    search = search.slice(0,10);
    res.send({payload: search});
});

问题排查与解决建议
  • 数据库连接配置错误
    本地正常但部署后查询失败,核心原因大概率是Heroku上的数据库配置没到位:

    • 确认Heroku已绑定对应的数据库服务(比如MongoDB Atlas),且连接字符串正确配置到项目的环境变量中
    • 检查后端代码是否通过环境变量读取数据库地址,而非硬编码本地的localhost地址
    • 执行heroku logs --tail查看实时日志,里面会明确显示数据库连接超时、认证失败等具体错误,这是定位问题的关键
  • 未捕获异步异常导致服务崩溃
    你的/getUsers接口用了async/await但没有错误捕获逻辑,一旦数据库查询抛出异常,请求会直接崩溃,Heroku就会返回503。给接口加上try-catch:

    app.post('/getUsers', async (req, res) =>{
        try {
            let payload = req.body.payload.trim();
            let search = await User.find({firstName: {$regex: new RegExp('^'+payload+'.*','i')}}).exec();
            search = search.slice(0,10);
            res.send({payload: search});
        } catch (err) {
            console.error(err);
            res.status(500).send({error: '查询失败,请稍后重试'});
        }
    });
    

    这样即使出错,也会返回合法JSON,避免前端解析失败,同时能在日志里看到错误详情。

  • 前端未处理HTTP错误状态
    当收到503这类错误状态码时,res.json()仍会执行,但返回的是Heroku的错误页面HTML而非预期JSON,所以会抛出SyntaxError。给fetch添加错误处理:

    fetch('getUsers',{
        method: 'POST',
        headers: {'content-type': 'application/json'},
        body: JSON.stringify({payload: e.value})
    })
    .then(res => {
        if (!res.ok) {
            throw new Error(`请求失败:${res.status}`);
        }
        return res.json();
    })
    .then(data => {
        // 原处理逻辑
    })
    .catch(err => {
        searchResults.innerHTML = '<p>服务器出错,请稍后重试</p>';
        console.error(err);
    });
    

    这样能捕获HTTP错误,避免解析无效内容。

  • 端口配置错误
    检查后端是否正确监听Heroku提供的端口:

    const port = process.env.PORT || 3000;
    app.listen(port, () => {
        console.log(`服务器运行在端口${port}`);
    });
    

    硬编码本地端口(比如3000)会导致Heroku无法正常启动服务,进而返回503。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:11:11