You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Express.js请求仅在增强中间件调用后才被识别为已增强的技术咨询

Express.js请求仅在增强中间件调用后才被识别为已增强的技术咨询

看起来你正在搭建一个Express.js的认证中间件工厂函数,但代码好像没写完?先帮你理一理当前的实现逻辑,再聊聊关于“请求仅在中间件调用后才被增强”的相关问题吧。

首先先把你提供的代码完整展示出来:

import type { Request, Response, NextFunction } from 'express'

export const authBuilder = (authenticate: boolean) => {
    return (req: Request, res: Response, next: NextFunction) => {
        if (!authenticate) {
            res.status(401).json({ message: 'Access denied.' })
            return
        }

        req.user = {
            name: 'John Doe'
        }
        // 这里记得调用next(),不然请求会一直挂住哦
        // next();
    }
}

先说说几个需要注意的点:

  • 请求类型扩展问题:默认的Express Request类型并没有user属性,直接给req.user赋值会触发TypeScript类型报错。你可以在项目里添加一个类型声明文件(比如src/types/express.d.ts)来扩展请求类型:

    declare global {
      namespace Express {
        interface Request {
          user?: { name: string };
        }
      }
    }
    

    这样TypeScript就能识别req.user这个自定义属性了。

  • 逻辑可能写反了:当前代码里,当authenticate为false时直接返回401拒绝访问,这和常规的认证逻辑相反——一般是authenticate为true时才需要做认证校验,为false时直接放行请求。如果这是笔误,你可以调整成这样:

    if (!authenticate) {
        return next(); // 不需要认证,直接放行到下一个中间件/路由
    }
    // 这里可以写实际的认证逻辑,比如校验token、查询用户信息等
    req.user = { name: 'John Doe' };
    next();
    
  • 关于“请求仅在中间件调用后才被增强”:这其实是Express中间件的正常工作机制——中间件是按注册顺序依次处理请求的,只有经过这个authBuilder生成的中间件处理的请求,才会被添加上req.user属性。

举个实际的路由注册例子:

// 创建需要认证的中间件
const requireAuth = authBuilder(true);
// 创建不需要认证的中间件
const skipAuth = authBuilder(false);

// 这个路由会经过认证中间件,req.user会被赋值
app.get('/protected', requireAuth, (req, res) => {
    res.json({ currentUser: req.user });
});

// 这个路由没使用认证中间件,req.user不存在
app.get('/public', (req, res) => {
    res.json({ message: '这是公开路由,无需认证' });
});

如果你的困惑是“为什么有些请求没有user属性”,那大概率是这些请求没有挂载这个增强中间件。你只需要确保所有需要获取用户信息的路由,都在路由处理函数前挂载这个中间件就可以了。

备注:内容来源于stack exchange,提问作者user20416

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:19:39