首页 > 有没有mongodb for nodejs 的插件在查询的时候可以返回查询结果?

有没有mongodb for nodejs 的插件在查询的时候可以返回查询结果?

有没有mongodb for nodejs 的插件在查询的时候可以返回查询结果?

目前找了几个nodejs的插件,mongoose,mongous等等,都是在查询方法里面使用回调函数来返回查询结果,但是我的node脚本需要把查询结果return出来,而不只是单纯的给console.log用啊。各位亲们有解决办法么?

例如:

index.prototype.a = function(){
    var vars = {};
    vars.something1 = {};
    vars.something2 = 123;
    mongous("db.test").find({name:'shura'},function(r){
        if(r){
            vars.something3= true;
        }else{
            vars.something3= false;
        }
    });
    return vars; 
}

我怎么才能在返回中存在vars.something3这个数据?

P.S.
我用到mongo主要是为了快速查询某个数据是否存在,然后根据返回来给定一个对象的一个或多个变量的值,然后整个代码返回这个对象。而并非根据返回做一些mongous外面获取不到的处理。因为我需要写的这个代码是给别的程序调用的一个数据处理对象,我需要返回一个处理过的数据对象。


如果硬要实现可以使用step或者async库,但你的思维方式没有转变到node.js的异步思维。建议还是参考 @nightire 的答案


今天在NPM里面闲逛,还真发现了同步返回的一个插件mongo-sync,分享出来。

下面是它的example:

var Server = require("mongo-sync").Server;
var server = new Server('127.0.0.1');
var result = server.db("test").getCollection("posts").find().toArray();
console.log(result);
server.close();

还是再次感谢各位的解答


首先有一个前提没有确定,不知道你需要把结果返回出来之后用在哪儿以及怎么用?这将影响你如何写代码。

那么我假设你是这样的情况,你有一个函数,这个函数需要使用异步请求的结果(我写比较通用的例子,不受限在 MongoDB 之下),一个可行的办法是这样的:

// 这是你的函数
var myFunc = function (passedValue, callback) {
    // 执行异步请求
    somethingAsync({ with: passedValue}, function (result) {
        callback(result);
    });
};

myFunc("something I want to pass in async", function (result) {
    // 这里,我可以对 result 做任何我想做的事,比如说:
    var obj = JSON.parse(result);    // 这就相当于你拿到了返回值。
});

P.S. 请忽略我对问题的评论,当时没看清是异步回调。


我看了你的补充,这里可以看出你对异步请求还不是很熟悉。你对 arr 的赋值其实是成功,但是仅限于异步请求的回调函数之内,而外层的 console.log(arr) 肯定不会是你期望的结果就是因为这句代码里的 arr 还没有被赋值(异步回调实际上是在 console.log 之后发生的)。

这里真正的问题是你究竟要如何使用 arr,按照你的意图,arr 的使用是一定依赖于对于 mongo 的请求的,因此对于 arr 的后续逻辑也一定要在异步回调运行之后才能生效。我猜测你的困惑在于你不想在异步回调里写太多代码,因为可能不好组织。但是这个解决办法有很多,我建议你学习一下 Promises。

在这里,我用简单的方式帮你整理一下。


function doSomething(array) { // 假设这里是你的业务逻辑 array.forEach(function (value, index) { console.log(value, index); console.dir(value); // ...更多你可能需要做的 }); } // 这里是业务逻辑真正开始运行的地方 mongous("db.test").find({}, doSomething);

意思是:你不必使用一个全局(相对地)对象来保存你向数据库请求的结果,而是直接编写你的业务逻辑,然后把这些业务逻辑根据需要作为对数据库的请求回调来执行即可。

如果你觉得还是不够用,那么请提供更完整的例子我们再分析。

【热门文章】
【热门文章】