常见错误类型及处理策略
- 网络错误
- 错误描述:包括网络连接失败、超时等情况。例如,客户端在连接服务器时可能因网络波动无法建立连接,或者服务器在请求外部资源时出现连接问题。
- 处理策略:
- 设置超时:在使用
http.request
或https.request
发起请求时,设置timeout
选项。例如:
const http = require('http');
const options = {
host: 'example.com',
port: 80,
path: '/',
timeout: 2000 // 2秒超时
};
const req = http.request(options, (res) => {
// 处理响应
});
req.on('timeout', () => {
req.abort(); // 终止请求
console.log('请求超时');
});
- **错误重试**:对于网络连接失败的情况,可以实现重试机制。例如使用`async - await`结合递归实现简单重试:
async function makeRequestWithRetry(url, maxRetries = 3, retryDelay = 1000) {
let retries = 0;
while (retries < maxRetries) {
try {
const response = await fetch(url);
return response;
} catch (error) {
retries++;
if (retries === maxRetries) {
throw error;
}
await new Promise(resolve => setTimeout(resolve, retryDelay));
}
}
}
- 请求解析错误
- 错误描述:如请求体格式不正确(非预期的JSON格式等)、URL解析错误等。当客户端发送的数据不符合服务器预期的格式时就会出现此类错误。
- 处理策略:
- 验证和解析请求体:对于JSON格式的请求体,使用
try - catch
块包裹JSON.parse
操作。例如:
const http = require('http');
http.createServer((req, res) => {
let body = '';
req.on('data', (chunk) => {
body += chunk.toString();
});
req.on('end', () => {
try {
const data = JSON.parse(body);
// 处理解析后的数据
} catch (error) {
res.statusCode = 400;
res.end('请求体格式错误');
}
});
}).listen(3000);
- **URL解析验证**:使用`url`模块解析URL并验证。例如:
const http = require('http');
const url = require('url');
http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
if (!parsedUrl.pathname || parsedUrl.pathname === '/') {
res.end('请提供正确的路径');
} else {
// 处理URL
}
}).listen(3000);
- 资源未找到错误(404错误)
- 错误描述:客户端请求的资源在服务器上不存在。
- 处理策略:
- 检查文件或路由:在服务器端,检查请求的文件路径或路由是否正确配置。例如,在使用Express框架时:
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.status(404).send('资源未找到');
});
app.listen(3000);
- 服务器内部错误(500错误)
- 错误描述:由于代码错误、未处理的异常等导致服务器无法正常处理请求。
- 处理策略:
- 全局错误捕获:在Express中,可以使用全局错误处理中间件捕获未处理的异常。例如:
const express = require('express');
const app = express();
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('服务器内部错误');
});
app.listen(3000);
- **记录错误日志**:使用日志库(如`winston`)记录错误详细信息,便于后续排查问题。例如:
const winston = require('winston');
const logger = winston.createLogger({
level: 'error',
format: winston.format.json(),
transports: [
new winston.transport.Console(),
new winston.transport.File({ filename: 'error.log' })
]
});
app.use((err, req, res, next) => {
logger.error({
message: err.message,
stack: err.stack,
req: {
method: req.method,
url: req.url
}
});
res.status(500).send('服务器内部错误');
});