【问题标题】:NodeJS String.replace() problem while filtering过滤时出现NodeJS String.replace()问题
【发布时间】:2020-06-28 10:57:40
【问题描述】:

我无法修改过滤参数

String.replace()

我可以从作为对象的 URL 中获取过滤键,但它从我这里得到了严重的错误。

过滤:{{URL}}/api/v1/bootcamps?averageCost[lt]=10000

当前格式: { averageCost: { lt: '10000' } }

右从at: { averageCost: { $lt: '10000' } }

所以我尝试将其转换为字符串并替换该值。但该值可以是:lt, lte, gt, gte, in 但它有一些问题,因为 .replace() 方法之后的行没有执行,当然catch 块包含错误...

我的代码sn-p:

try {
        console.log(req.query);
        const queryStr = JSON.stringify(req.query);
        console.log(queryStr); //thats the last thing I get
        queryStr = queryStr.replace(
            /\b(gt|gte|lt|lte|in)\b/g,
            match => `$${match}`
        );
        console.log(queryStr); // I dont get this

        const bootcamps = await Bootcamp.find();

        res.status(200).json({
            succes: true,
            count: bootcamps.length,
            data: bootcamps
        });
    } catch (err) {
        return res.status(404).json({ succes: false });
    }

【问题讨论】:

    标签: node.js json filtering


    【解决方案1】:

    我试过了,但是没用

    try {
            console.log(req.query);
            const queryStr = JSON.stringify(req.query);
            console.log(queryStr); //thats the last thing I get
            const regex = /\b(gt|gte|lt|lte|in)\b/g;
            queryStr = queryStr.replace(regex, '$$' + '$1');
            JSON.parse(queryStr);
            console.log(queryStr); // I dont get this
    
            const bootcamps = await Bootcamp.find();
    
            res.status(200).json({
                succes: true,
                count: bootcamps.length,
                data: bootcamps
            });
        } catch (err) {
            return res.status(404).json({ succes: false });
        }
    

    【讨论】:

    • 您没有分配新变量...queryStr = JSON.parse(queryStr);
    • 仍然不起作用,但我知道为什么。当我注销 queryStr 在我看来,我得到一个对象而不是字符串,这就是它不起作用的原因:这就是我在登录 queryStr = JSON.stringify(req .query); : {"averageCost":{"lt":"10000"}} 我认为那不是字符串...
    • 感谢您的帮助,我终于解决了。 queryStr 是常量。我将其更改为 let ,现在它可以工作了!再次感谢您!
    • 所以请将我的答案标记为正确答案。谢谢。
    【解决方案2】:

    要正确替换它,您应该使用以下内容:

    let queryStr = '{ "averageCost": { "lt": "10000" }, "test": { "gt": "12345"} }';
    const regex = /\b(gt|gte|lt|lte|in)\b/g;
    queryStr = queryStr.replace(regex, '$$' + "$1"); // <-- here is the correct replace
    

    这会将queryStr 替换为:

    { "averageCost": { "$lt": "10000" }, "test": { "$gt": "12345"} }
    

    JSFiddle https://jsfiddle.net/c52z8ewr/

    如果您需要返回对象,只需执行JSON.parse(queryStr)

    【讨论】:

    • 感谢您的帮助!它仍然不起作用,但至少我更进一步。问题是您的 queryStr 看起来像这样: "{ averageCost: { lt: '10000' } }"; 但是当我运行 const queryStr = JSON. stringify(req.query); 行,然后记录下来,它看起来像这样:{"averageCost":{"lt":"10000"}}...。就这样为什么它不起作用...我该如何解决这个问题?
    • 您需要返回的 JS 对象而不是字符串吗?替换后就做JSON.parse(queryStr)
    • 是的,我需要它作为一个对象,但首先我需要将 lt 替换为 $lt
    • 所以它以这种格式工作:* "{ averageCost: { lt: '10000' } }",但我的看起来像这样(在字符串化之后):*{"averageCost" :{"lt":"10000"}}
    • 这不是问题,看看答案就可以了
    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多