MST

星途 面试题库

面试题:Node.js HTTP服务中常见的错误类型及一般处理方式

在Node.js的HTTP服务开发中,通常会遇到哪些类型的错误,例如网络错误、请求解析错误等。针对每种常见错误类型,请阐述你一般会采取怎样的处理策略。
42.0万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

常见错误类型及处理策略

  1. 网络错误
    • 错误描述:包括网络连接失败、超时等情况。例如,客户端在连接服务器时可能因网络波动无法建立连接,或者服务器在请求外部资源时出现连接问题。
    • 处理策略
      • 设置超时:在使用http.requesthttps.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));
    }
  }
}
  1. 请求解析错误
    • 错误描述:如请求体格式不正确(非预期的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);
  1. 资源未找到错误(404错误)
    • 错误描述:客户端请求的资源在服务器上不存在。
    • 处理策略
      • 检查文件或路由:在服务器端,检查请求的文件路径或路由是否正确配置。例如,在使用Express框架时:
const express = require('express');
const app = express();
app.use((req, res, next) => {
  res.status(404).send('资源未找到');
});
app.listen(3000);
  1. 服务器内部错误(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('服务器内部错误');
});