MST

星途 面试题库

面试题:Node.js中间件在复杂应用架构中的设计与应用

假设你正在开发一个大型Node.js应用,包含多个路由和不同功能模块。请设计一套中间件架构,实现用户认证、日志记录以及错误处理,并且说明如何确保中间件的执行顺序和避免中间件之间的冲突。
10.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

1. 用户认证中间件

在Node.js中,我们可以创建一个用户认证中间件,比如检查JWT(JSON Web Token)。

const jwt = require('jsonwebtoken');

const authenticateUser = (req, res, next) => {
    const token = req.headers['authorization'];
    if (!token) {
        return res.status(401).send('Access denied. No token provided.');
    }
    try {
        const decoded = jwt.verify(token, 'your_secret_key');
        req.user = decoded;
        next();
    } catch (error) {
        res.status(400).send('Invalid token.');
    }
};

2. 日志记录中间件

日志记录中间件可以记录每个请求的相关信息,如请求方法、URL等。

const logger = (req, res, next) => {
    console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
    next();
};

3. 错误处理中间件

错误处理中间件用于捕获在其他中间件或路由处理函数中抛出的错误。

const errorHandler = (err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something went wrong!');
};

4. 确保中间件执行顺序

在Express(常用的Node.js web框架)中,中间件的执行顺序是按照它们被定义的顺序。

const express = require('express');
const app = express();

// 先记录日志
app.use(logger);
// 再进行用户认证
app.use(authenticateUser);

// 定义路由
app.get('/protected', (req, res) => {
    res.send('This is a protected route.');
});

// 错误处理中间件要放在最后
app.use(errorHandler);

const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

5. 避免中间件之间冲突

  • 明确职责:每个中间件应该有明确单一的职责,如认证中间件只负责认证,日志中间件只负责记录日志。这样可以减少逻辑交叉导致的冲突。
  • 参数传递规范:如果中间件之间需要传递数据,通过reqres对象传递,并且要保证传递的数据不会被其他中间件意外修改。例如,认证中间件将认证后的用户信息挂载到req.user上,其他中间件在使用时不应修改这个对象,除非是有意的更新操作。
  • 错误处理:错误处理中间件统一捕获和处理其他中间件抛出的错误,避免错误向上传递或在不同中间件中重复处理导致不一致。