首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要使用"/projects?technologies=AI&industries=Security“处理查询字符串nodeJS

需要使用"/projects?technologies=AI&industries=Security“处理查询字符串nodeJS
EN

Stack Overflow用户
提问于 2022-05-11 10:42:55
回答 2查看 35关注 0票数 0

这是我第一次创建查询字符串参数,所以请帮助我。

  • 我想过滤基于数据的json字段“技术、行业和成熟度”--每个领域(技术、行业和成熟度)都有一系列元素。我想过滤每个字段的元素。在这里输入图像描述
  • 我编写了后端代码:

代码语言:javascript
复制
const { pick } = require('lodash');

const toArray = props =>
  (props && props.split ? props.split(',') : props || []).map(item => item.trim());
 console.log("this is in filter props: ", toArray)

module.exports = (entities, query) => {

  const fields = toArray(query.pick);
  const industries = toArray(query.industries);
  const technologies = toArray(query.technologies);
  const maturity = toArray(query.maturity);


  return entities.reduce((accumulator, entity) => {
    const hasTecnology = technologies.length

      ? technologies.every(technology => entity.technologies && entity.technologies.includes(technology))
      : true;
    
    const hasIndustury = industries.length
      ? industries.every(industry => entity.industries && entity.industries.includes(industry))
      : true;
    
      const hasMaturity = maturity.length
      ? maturity.every(maturty => entity.maturity && entity.maturity.includes(maturty))
      : true;
    const condition = hasTecnology && hasIndustury && hasMaturity;

    return condition
      ? [...accumulator, fields.length ? pick(entity, fields) : entity]
      : accumulator;
  }, []);
};

  • 我的控制器功能:

代码语言:javascript
复制
  async find(ctx) {
    const { query } = ctx.request;
    const email = ctx.state.user.email; 
    const userProjects = strapi.cache.users[email].displayCatalog;

    let projects = strapi.cache.projects.filter(project => userProjects.includes(project.slug));

    if (query.pick || query.industries || query.technologies || query.maturity) {
      projects = filter(projects, query);
    }
    return buildResponse(projects.map(project => hideSensitive(project, userProjects, email)));
  },

  • 此代码仅对单个参数"/projects?technologies=AI“有效,但我正在尝试获取此类型的filter usign。

注:如果我们选择“技术”字段的“前安全”元素或行业字段的“前人工智能”元素,则数据将同时显示“技术安全”和“行业AI.”。

请帮帮我

EN

回答 2

Stack Overflow用户

发布于 2022-05-11 11:30:50

您可以查询所有字段。

把这个放在controller.js文件中。

代码语言:javascript
复制
        const queryObj = { ...req.query };
        let queryStr = JSON.stringify(queryObj);
     
        queryStr = queryStr.replace(/\b(gt|gte|lt|lte|eq|ne)\b/g, match => `$${match}`);

        console.log(queryStr);

       const doc1 = await Model.find(JSON.parse(queryStr));

在上述代码中

代码语言:javascript
复制
api/projects?technologies[eq]="AI"&industries[eq]="Security"
票数 0
EN

Stack Overflow用户

发布于 2022-05-12 22:57:51

  • 谢谢你的建议,我修改了一些代码,得到了解决方案。

代码语言:javascript
复制
const toArray = props =>
  (props && props.split ? props.split(',') : props || []).map(item => item.trim());

const hasField = (entity, fields) => {
  if (!fields.length) {
    return false;
  }
  for (let i = 0; i < fields.length; i + 1) {
    if (entity && entity.includes(fields[i])) {
      return true;
    }
  }
  return false;
};

module.exports = (entities, query) => {
  const industries = toArray(query.industries);
  const technologies = toArray(query.technologies);
  const maturity = toArray(query.maturity);

  return entities.filter(entity => {
    const hasTecnology = hasField(entity.industries, industries);
    const hasIndustury = hasField(entity.technologies, technologies);
    const hasMaturity = hasField(entity.maturity, maturity);

    const condition = hasTecnology || hasIndustury || hasMaturity;

 
    if (condition) {
      return entity;
    }
    return null;
  }, []);
};

  • 我的控制器也会一样
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72199635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档