【问题标题】:duplicate params get array by node.js express or vue router重复参数通过 node.js express 或 vue 路由器获取数组
【发布时间】:2020-09-15 20:50:17
【问题描述】:

我有一个大问题。

在我完成的所有其他项目中,我使用了 apache 或 Nginx 和 PHP。 如果我有一个像 /test?param=1&param=2 这样的 Url,则 $_REUEST['param'] 的值为 2。

但在 Node.js (Express) 中,我得到一个数组 [1,2]

我可以使用new URLSearchParams(this.$route.fullPath) 而不是.get().getAll() 方法只获得一个值。但是我们有一个很大的项目,在几个文件中有很多循环和 this.$route.query 的用法。

是否可以在一个地方过滤 this.$route.query ? 还是 express 能够像 apache/nginx 这样改变这个参数的返回?

【问题讨论】:

  • 您检查过req.params 对象吗?它应该以对象格式为您提供参数
  • @SyedFaizan:req.params 包含路径参数,而不是查询参数...
  • 对不起,我的意思是req.query,感谢您指出@eol

标签: node.js express vue.js vue-router query-parameters


【解决方案1】:

这确实是express底层解析器works this way的问题。作为一种解决方法,您可以编写一个小助手来提取所需的值,以防查询参数是一个数组。比如:

function getQueryParam(req, queryParam) {
    if (!req.query) {
        return undefined;
    }
    if (Array.isArray(req.query[queryParam])) {
        const paramArray = req.query[queryParam];
        return paramArray[paramArray.length - 1]; // always return the last provided value
    }
    return req.query[queryParam];
}

你可以这样使用它:

app.get('/', (req, res) => {
    const paramValue = getQueryParam(req, "param");
    // do something with paramValue 
});

【讨论】:

    【解决方案2】:
    app.use((req, res, next) => {
          if (req.query) {
            const oldQuery = JSON.stringify(req.query);
            const queryStrings = [];
            Object.keys(req.query).forEach((paramKey) => {
              if (Array.isArray(req.query[paramKey])) {
                const paramArray = req.query[paramKey];
                req.query[paramKey] = paramArray[paramArray.length - 1]; // always return the last provided value
                queryStrings.push(`${paramKey}=${req.query[paramKey]}`);
              }
            });
            const newQuery = JSON.stringify(req.query);
            if (oldQuery !== newQuery) {
              res.redirect(301, `${req.path}?${queryStrings.join('&')}`);
            }
          }
          next();
        });
    

    这通过重定向起作用。不是我想要的完美的东西,但结果是一样的

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 2016-04-01
      • 2016-05-09
      • 2019-07-21
      • 2014-04-29
      • 2018-07-12
      • 2019-08-11
      • 2018-11-22
      • 2014-10-16
      相关资源
      最近更新 更多