调试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
相关产品推荐
相关产品推荐

