【问题标题】:ExpressJs version route through header or query paramsExpressJs 版本通过标头或查询参数路由
【发布时间】:2025-12-06 04:25:01
【问题描述】:

我有使用 ExpressJs 开发的不同版本的 api,我通过标题或通过像 example.com/users?version=1example.com/users?version=2 这样的查询字符串获取版本详细信息 或者我进入标题。

我想通过我通过 url 获得的查询参数路由我的应用程序 api app.js

app.use('/', (req, res, next) => {
    app.use(require('./v'+req.query.version));
    next();
});

我在文件夹v1/index.js中有两个版本

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

app.get('/', (req, res) => {
    res.send('Hello World! v01')
});

module.exports = app;

v2/index.js 一样

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

app.get('/', (req, res) => {
    res.send('Hello World! v02')
});

module.exports = app;

当我通过 url 调用 api 时,我只会得到我首先调用的版本的响应

如果我第一次打电话给example.com/users?version=1,我会得到'Hello World! v01'的回复,

之后如果我打电话给example.com/users?version=2,我会得到'Hello World! v01'的回复

如果我在启动脚本后第一次调用 version=2,我每次都会收到 'Hello World! v02' 响应。

我不希望有像example.com/v1 这样的应用程序是他们使用查询参数或通过标头解决此版本问题的任何方式。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    为什么要动态导入可能会导致问题。

    假设我通过example.com/users?version=23424

    // v1/index
    const express = require("express");
    const router = express.Router();
    router.get("/", (req, res) => {
      res.send("Hello World! v01");
    });
    module.exports = router;
    
    // v2/index
    const express = require("express");
    const router = express.Router();
    router.get("/", (req, res) => {
      res.send("Hello World! v02");
    });
    module.exports = router;
    
    // server
    const express = require("express");
    const app = express();
    const v1 = require("./v1/index");
    const v2 = require("./v2/index");
    app.use("/", (req, res, next) => {
    const { version } = req.query;
      if (version !== "1" && version !== "2") {
        return res.json({
          message: "Not found",
        });
      }
      const router = version === "1" ? v1 : v2;
      router(req, res, next);
      next();
    });
    

    【讨论】:

    • 我试过你的代码,但如果我在启动脚本后第一次调用 version=2,我每次都会得到Hello World! v02 响应,如果我先调用 version=1,我每次都会得到Hello World! v01 ,即使我更改版本也使用相同的路线
    • @Jay 我已经更新了我的答案,希望能解决这个问题。