- 错误处理策略:
- 使用
try - catch
块来捕获同步代码中的错误。对于异步操作,使用async - await
结合try - catch
来处理可能出现的错误。
- 定义不同类型的错误类,以便于区分和处理不同类型的错误,例如网络错误可以定义为
NetworkError
类,数据解析错误可以定义为ParseError
类等。
- 捕获错误:
try {
// 可能会抛出错误的同步代码,比如数据解析
const data = JSON.parse('{invalid json}');
} catch (error) {
// 捕获错误
if (error instanceof SyntaxError) {
// 处理数据解析错误
const parseError = new ParseError('数据解析错误', error);
// 后续处理,如记录日志,返回错误给客户端
}
}
async function asyncOperation() {
try {
// 可能会抛出错误的异步操作,比如网络请求
const response = await fetch('invalid - url');
} catch (error) {
// 捕获错误
if (error.name === 'TypeError') {
// 处理网络错误(这里简单以TypeError为例,实际网络错误可能更复杂)
const networkError = new NetworkError('网络错误', error);
// 后续处理,如记录日志,返回错误给客户端
}
}
}
- 返回错误信息给客户端:
- 在捕获到错误后,根据错误类型构造合适的HTTP响应。例如,对于数据解析错误,可以返回HTTP 400 Bad Request状态码,对于网络错误可以返回HTTP 500 Internal Server Error状态码。
const http = require('http');
const server = http.createServer((req, res) => {
try {
// 中间件逻辑
} catch (error) {
if (error instanceof ParseError) {
res.writeHead(400, { 'Content - Type': 'application/json' });
res.end(JSON.stringify({ error: '数据解析错误' }));
} else if (error instanceof NetworkError) {
res.writeHead(500, { 'Content - Type': 'application/json' });
res.end(JSON.stringify({ error: '网络错误' }));
}
}
});
server.listen(3000);
- 保证中间件稳定性和后续中间件正常执行:
- 在捕获错误并处理后,避免让错误向上抛出,从而保证当前中间件不会因为未处理的错误而崩溃。
- 如果使用了Express等框架,可以利用其错误处理中间件机制,将错误传递给专门的错误处理中间件,而不是在每个中间件内部直接结束响应。这样可以保证后续中间件有机会执行一些清理或记录操作等。
const express = require('express');
const app = express();
app.use((req, res, next) => {
try {
// 中间件逻辑
next();
} catch (error) {
next(error);
}
});
app.use((error, req, res, next) => {
// 集中处理错误
if (error instanceof ParseError) {
res.status(400).json({ error: '数据解析错误' });
} else if (error instanceof NetworkError) {
res.status(500).json({ error: '网络错误' });
}
});
app.listen(3000);