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

调试NodeJS服务器:输入无效地点后避免崩溃并持续运行

解决无效地点导致服务器崩溃的问题

你的服务器崩溃是因为输入无效地点时,OpenWeatherMap API会返回错误响应(比如404状态码),但代码没处理这类异常:比如尝试访问不存在的weatherObject.main.temp或weatherObject.weather[0].icon时,会抛出未捕获的错误,直接终止服务器进程。

以下是修复后的完整方案,核心是增加错误捕获和响应状态判断:

修复后的Node.js代码

const express = require('express');
const https = require('https')
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.urlencoded({extended:true}));

app.get("/",(req,res)=>{
    res.sendFile(__dirname+"/index.html")
})

app.post("/",(req,res)=>{
    const cityName = req.body.cityName;
    const urls = `https://api.openweathermap.org/data/2.5/weather?q=${cityName}&appid=18e0286ef90587ff4b9c9d686b23b11c&units=metric`;

    const request = https.get(urls,(response)=>{
        // 1. 先检查API响应状态码
        if (response.statusCode !== 200) {
            res.send(`<h1>无法获取该地点的天气信息,状态码:${response.statusCode}</h1>`);
            return;
        }

        let rawData = '';
        response.on("data", (chunk) => {
            rawData += chunk;
        });

        response.on("end", () => {
            try {
                // 2. 解析JSON并捕获异常
                const weatherObject = JSON.parse(rawData);
                const weatherTemp = weatherObject.main.temp;
                const weatherIcon = `<img src='https://openweathermap.org/img/wn/${weatherObject.weather[0].icon}@2x.png'></img>`;
                
                res.write("<h1> 当前温度: " + weatherTemp + "°C </h1>");
                res.write(weatherIcon);
                res.send();
            } catch (error) {
                // 捕获解析错误或属性访问错误
                res.send("<h1>处理天气数据时出错,请检查输入的地点是否正确</h1>");
                console.error("数据处理错误:", error);
            }
        });
    });

    // 3. 捕获HTTP请求本身的错误(比如网络故障)
    request.on('error', (error) => {
        res.send("<h1>请求天气API时出错,请稍后重试</h1>");
        console.error("请求错误:", error);
    });
});

app.listen(3000,()=>{
    console.log("服务器运行在端口3000");
});

关键修复点说明

  • 监听HTTP请求错误:给https.get返回的请求对象添加error事件监听,处理网络故障等请求层面的错误,避免服务器崩溃。
  • 检查响应状态码:在处理响应前先判断状态码,非200直接返回错误提示,不继续解析数据。
  • 收集完整响应数据:原来的data事件每次只返回部分数据,改用end事件处理完整响应内容,避免JSON解析不完整的问题。
  • try-catch包裹数据处理:捕获JSON解析失败或属性不存在的异常,返回友好提示给用户,同时在控制台记录错误便于调试。
  • 确保响应只发送一次:通过return和条件判断,避免多次调用res.send()导致的错误。

修改后,无论输入无效地点还是遇到网络问题,服务器都能处理异常并保持运行,同时给用户返回清晰的错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:20:18