路过的前辈们进来看看~在线等啊
发布于 11 年前 作者 beiyio 4511 次浏览 最后一次编辑是 8 年前

/查询/ function select(a_where,a_data) {

var t_ret=0;
t_ret= db_connector.collection(a_where, function(err, collection) {
 collection.find(a_data, function(err, value){
		 value.toArray(function(err,arr){
		  return ''true";
		 })
	});

}); return ''false"; }

现在调用select 虽然里面的代码执行了可是一直返回false 我明白他为什么会返回 false 但是不知道该如何修改让他返回true

15 回复

5555555555那个前辈能指点下

node的api里到处都是回调,所以我们也要习惯这种编程方式。。。 以往我们想获得方法的返回值都是这么写:var foo=bar(); 但是现在得这么写: bar( function(result){foo=result}); 推荐看一下step,可以避免callback的嵌套,https://github.com/creationix/step

还是没太懂啊

把最后 一个返回return ''false";去除试一下,因Node操作文档用的是异步的方式。如果直接返回可能会出问题

现在没有出错,只是返回不了true

@beiyio 你那样写是不会报错,但代码执行的时候 因为find(******)的回调虽然返回了true,但不会马上执行到的,而是先执行了最后的那句return false

@beiyio 是不会报错,但代码在执行到回调方法的时候,不会等待回调都执行完了才做下一步的,而是直接跑到return false去了,所以返回的都是你最后的一句 false

@iln168 已经去掉了。但是返回的undeffind

@beiyio 你那个方法还要修改一下(我提供一下参考代码)

Foods.find = function(option, callback){
mongodb.open(function(err, db){
    if(err)throw err;

    db.collection('Foods',  {safe : true}, function(err, collection){

        collection.find({}, function(err, foods){
            if(err)throw err;

            callback(err, foods);
            db.close();
        });
    });

});
}

差不多都以回调的方式,你试一下

@beiyio node里面要获得方法返回值一般不会直接用等号,像这样:var result=someFunction(); 而是传一个callback进去:

// the definition of the function
function someFunction(callback){
    //do some work
    callback('true')//invoke the callback to give it the result;
}
//invoke the function
someFunction(function callback(result){
    //now you get the result;
});

@iln168 额。我还是写失败了~哭了。

@iln168 前辈有QQ吗,加下QQ指导下吧

@beiyio 我把代码全给你吧以下是 (1)food文件的代码

var mongodb = require('./db');
function Foods(food){
this.name = food.name;
this.imgUrl = food.imgUrl;
this.money =food.money;
this.source = food.source;
this.address = food.address;
this.time = food.time;
}

module.exports = Foods;

Foods.get = function get(option, callback){
mongodb.open(function(err, db){
    if(err){
        return callback(err);
    }

    db.collection('Foods', function(err, collection){
        if(err){
            mongodb.close();
            return callback(err);
        }
        var query = {};
        collection.find(query).sort({time:-1}).toArray(function(err, docs){
            mongodb.close();
            if(err){
                return callback(err);
            }

            return callback(null, docs);
        });
    });

});
}

(2)db的代码如下 :

var setting = require('../settings'),
mongo = require('mongodb'),
Db = mongo.Db,
Connection = mongo.Connection,
Server = mongo.Server;

module.exports = new Db(setting.db, new Server(setting.host, Connection.DEFAULT_PORT, {}));

(3)你再写一个测试页:

var Foods = require('food');
Foods.get({name : 'lif_testName'}, function(err, data){
    if(err)throw err;
    console.log(data);
});

按上面的三步一定行的

LZ上面的代码是一个异步调用的过程你return出去的是collection.find()中的回调函数的返回结果,并不是select函数返回的结果!并且这是异步调用过程,在你的collection.find()还没结束时,select函数已经执行完毕了!

回到顶部