CNode

路过的前辈们进来看看~在线等啊

Bbeiyio发布于14 年前最后回复14 年前15 回复5281 浏览0 收藏

/查询/ 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)

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

@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);
});

按上面的三步一定行的

A
a272121742#2·14 年前

异步

H
huangdh3#3·14 年前

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

B
beiyio#4·14 年前

5555555555那个前辈能指点下

L
ltebean#5·14 年前

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

I
iln168#7·14 年前

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

I
iln168#9·14 年前
引用 ltebeannode的api里到处都是回调,所以我们也要习惯这种编程方式。。。 以往我们想获得方法的返回值都是这么写:var foo=bar(); 但是现在得这么写: bar( function(resu...

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

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

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

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

@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();
        });
    });

});
}

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

L
ltebean#13·14 年前
引用 ltebeannode的api里到处都是回调,所以我们也要习惯这种编程方式。。。 以往我们想获得方法的返回值都是这么写:var foo=bar(); 但是现在得这么写: bar( function(resu...

@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;
});
参与回复
登录后即可参与回复。登录