node.js - 有没有mongodb for nodejs 的插件在查询的时候可以返回查询结果?
天蓬老师
天蓬老师 2017-04-17 11:09:07
[Node.js讨论组]

有没有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外面获取不到的处理。因为我需要写的这个代码是给别的程序调用的一个数据处理对象,我需要返回一个处理过的数据对象。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
天蓬老师

今天在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();

还是再次感谢各位的解答

PHPz

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

那么我假设你是这样的情况,你有一个函数,这个函数需要使用异步请求的结果(我写比较通用的例子,不受限在 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);

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

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

怪我咯

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号