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

Express.js中能否在controller内调用其他路由获取响应结果

解决方案

方案1:抽离公共逻辑复用(最推荐,无额外性能开销)

你当前/protected路由返回的用户信息本质是从JWT解析衍生而来,直接抽离公共方法即可在任意controller中复用,不需要额外发起请求:

  1. 新增公共方法,可放在authController中统一维护
// authController.js 新增代码
module.exports.getUserInfoFromReq = (req) => {
    const token = req.cookies.jwt;
    if (!token) return null;
    try {
        const data = jwt.verify(token, "secret token");
        // 若userRole需要从数据库查询,可在此处补充对应逻辑
        return { id: data.id, role: req.userRole };
    } catch {
        return null;
    }
};
  1. 其他controller需要获取对应数据时,直接调用该方法即可:
// 其他controller中调用示例
const authController = require('./authController的路径');

module.exports.yourOtherMethod = (req, res) => {
    const userInfo = authController.getUserInfoFromReq(req);
    if (!userInfo) return res.sendStatus(403);
    // 直接使用获取到的userInfo即可,和/protected返回的JSON结构完全一致
    console.log(userInfo);
    // 后续业务逻辑
}

方案2:内部发起HTTP请求调用/protected接口

如果确实需要获取路由的完整响应(比如路由有其他额外处理逻辑无法抽离),可以在另一个controller中发起HTTP请求,注意需要携带当前请求的cookie通过鉴权:
示例使用node-fetch发起请求:

const fetch = require('node-fetch');
// 替换为你实际的服务端口和部署地址
const SERVICE_BASE_URL = 'http://localhost:3000';

module.exports.yourOtherMethod = async (req, res) => {
    try {
        const protectedResponse = await fetch(`${SERVICE_BASE_URL}/protected`, {
            headers: {
                Cookie: req.headers.cookie || ''
            }
        });
        if (protectedResponse.status !== 200) {
            return res.sendStatus(protectedResponse.status);
        }
        const resultJson = await protectedResponse.json();
        // 此处resultJson就是/protected返回的JSON数据
        console.log(resultJson);
        // 后续业务逻辑
    } catch (err) {
        console.error('调用接口失败', err);
        return res.sendStatus(500);
    }
}

注意事项

  • 你当前的authToken中间件没有给req挂载userRole属性,需要检查是否漏写了对应逻辑,否则/protected返回的role字段会是undefined
  • 内部发起HTTP请求时,部署环境建议使用内网地址,减少公网带宽开销和延迟

内容的提问来源于stack exchange,提问作者Gibon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:03