程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_450_0@如何解决如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant? 开发过程中遇到如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant的解决方法建议,希望对你解决如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant有所启发或帮助;

我试图在单个 API 调用中传递两个搜索请求,但有时我会同时收到两个请求结果,有时只收到一个请求结果。 基本上这是我在 cloudant db 中的 JsON 结构:

{
    "_ID": "123","name": "Naveen","hoby": "Cricket"
},{
    "_ID": "234","name": "Varun","hoby": "chess"
},{
    "_ID": "345","name": "Tarun",{
    "_ID": "456","name": "pavan","hoby": "chess"
}

这里我的要求是获得 Cricket 50 成员的“hoby”和 Chess 50 成员的“hoby”。 为此,这就是我目前正在尝试的方式:

doGet: function(request,responsE) {
    var useRSState = [];
    var names = { "useRSState": useRSState,"message": "ok" };
    if (!myDb) {
        response.Json({ "message": "Dataabase connection Failed" });
        return;
    }
    var queryForCricket = {
        "SELEctor": {
            "hoby": "Cricket"
        },"fIElds": [
            "_ID","name","hoby"
        ],"sort": [],"limit": 50,"skip": 0
    };
    var queryForChess = {
        "SELEctor": {
            "hoby": "chess",},"skip": 0
    };
    async.parallel(
        [
            myDb.find(queryForCricket,function (err,body) {
                if (!err) {
                    body.docs.forEach(function (doC) {
                        if (doC)
                            useRSState.push(doc);
                    });
                    response.Json(names);
                }
            }),myDb.find(queryForChess,body) {
                if (!err) {
                    body.docs.forEach(function (doC) {
                        if (doC)
                            useRSState.push(doc);
                    });
                }
            })
        ],results) {
            if (err) {
                response.send({ "message": "Read operration Failed" });
                return;
            }
        });
}

我编写了两个查询并通过异步调用传递了两个查询,但始终没有正确获得结果。那么有没有什么优化的方法来处理查询部分和获取结果。

@H_450_0@解决方法

这里的问题是您的最终结果取决于 async.parallel find 函数的两个回调的执行顺序。当第二个 find 首先完成时,您将获得两个结果,但当第一个 find 首先完成时,您将仅获得 queryForCricked 查询的结果。

要获得这两个结果,您应该在最终回调函数中收集它们并在那里使用 response.json

...
 async.parallel(
    [
        myDb.find(queryForCricket,function (err,body) {
            if (!err) {
                body.docs.forEach(function (doC) {
                    if (doC)
                        usersState.push(doc);
                });
            }
        }),myDb.find(queryForChess,body) {
            if (!err) {
                body.docs.forEach(function (doC) {
                    if (doC)
                        usersState.push(doc);
                });
            }
        })
    ],results) {
        if (err) {
            response.send({ "message": "Read operration failed" });
            return;
        }

        response.json(names);
    }
);
...

然在共享 usersState 数组中收集数据是完全可行的方法,但它存在缺陷。例如,您无法控制插入 find 数据的顺序。 async.parallel 提供了一种从正在运行的函数中收集数据的更好方法。您可以在每个函数中使用 callBACk async.parallel inserts 来收集最终回调中的数据:

async.parallel(
    [
        function (cb) { myDb.find(queryForCricket,cb); },function (cb) { myDb.find(queryForChess,],results) {
        if (err) {
            response.send({ "message": "Read operration failed" });
            return;
        }
 
        // result is an array with data from queries: [crickets.body,chess.body]
        results.forEach(function (body) {
            body.docs.forEach(function (doC) {
                if (doC) usersState.push(doc);
            });
        });

        response.json(names);
    }
);
...

大佬总结

以上是大佬教程为你收集整理的如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant全部内容,希望文章能够帮你解决如何使用 Node js 在单个 API 调用中传递两个请求 - Cloudant所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。