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

Node-Express请求查询过滤与嵌套JSON数据展示问题

解决你的Node-Express过滤嵌套JSON数据问题

看起来你已经找对了方向,但几个关键细节导致函数返回空对象,过滤逻辑也存在偏差。我来帮你修正代码,一步步解决问题:

问题分析

  1. 返回空对象:你的filterTranslations函数最后返回的是初始化的空output,而非处理后的translations对象,这是最直接的问题。
  2. 查询参数处理错误:req.query.languages和req.query.namespaces是逗号分隔的字符串(比如"en,fi"),你需要把它们转换成数组才能正确匹配,不能直接用字符串做对比。
  3. 过滤逻辑不准确:原代码里的lng !== languages和ns !== namespaces只能匹配单个值,无法处理多语言/多命名空间的情况,而且判断逻辑写反了(应该保留符合条件的,而非删除不符合的)。

修正后的代码

第一步:修改filterTranslations函数

const filterTranslations = (namespacesQuery, languagesQuery) => {
  const output = {};
  // 处理查询参数:转成数组,过滤空值,去重
  const targetLanguages = languagesQuery 
    ? languagesQuery.split(',').map(lang => lang.trim()).filter(Boolean) 
    : Object.keys(translationData);
  const targetNamespaces = namespacesQuery 
    ? namespacesQuery.split(',').map(ns => ns.trim()).filter(Boolean) 
    : [];

  // 遍历目标语言
  targetLanguages.forEach(lang => {
    // 如果原数据里没有该语言,直接跳过
    if (!translationData[lang]) return;
    
    // 初始化当前语言的对象
    output[lang] = {};
    
    // 确定要保留的命名空间:如果没传namespaces,保留所有;否则只保留指定的
    const namespacesToKeep = targetNamespaces.length > 0 
      ? targetNamespaces 
      : Object.keys(translationData[lang]);
    
    // 遍历要保留的命名空间,添加到output
    namespacesToKeep.forEach(namespace => {
      if (translationData[lang][namespace]) {
        output[lang][namespace] = { ...translationData[lang][namespace] };
      }
    });
  });

  return output;
};

第二步:优化Express路由返回

你的路由逻辑没问题,改成res.json()可以让浏览器展示格式化后的JSON,更易读:

app.get('/', (req, res) => {
  const filteredData = filterTranslations(
    req.query.namespaces,
    req.query.languages,
  );
  // 以格式化JSON返回数据
  res.json(filteredData);
})

代码说明

  • 参数处理:把逗号分隔的查询参数转成数组,同时处理空值(比如用户输入,en这种无效格式);如果没传参数,默认返回所有语言/命名空间。
  • 构建output对象:通过遍历目标语言和命名空间,主动把符合条件的数据添加到output里,比删除不需要的属性更清晰、更安全。
  • 边界情况处理:
    • 未传languages时,返回所有语言的对应命名空间数据;
    • 未传namespaces时,返回对应语言的所有命名空间数据;
    • 如果传的语言或命名空间不存在,会自动跳过,不会抛出错误。

现在测试你的示例URL:http://localhost:5000/?namespaces=auth&languages=en,fi,会得到预期的结果:

{
  "en": {
    "auth": { "welcomeMessage3": "Hi John" }
  },
  "fi": {
    "auth": { "welcomeMessage3": "Moi name " }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:42:49