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

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

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


9 回复

当然可以!根据你提供的代码片段,问题在于异步操作的处理。在Node.js中,数据库查询是异步操作,而你的函数没有正确处理这些异步回调。

问题分析

  1. db_connector.collection 是一个异步操作,它不会立即返回结果。
  2. collection.find 同样是一个异步操作,它也不会立即返回结果。
  3. value.toArray 也是一个异步操作,它需要时间来将查询结果转换为数组。

由于这些操作都是异步的,直接返回 false 会导致函数在实际查询完成之前就结束了。

解决方案

我们可以使用回调函数来处理异步操作的结果。以下是修改后的代码示例:

// 修改后的 select 函数
function select(a_where, a_data, callback) {
    db_connector.collection(a_where, function(err, collection) {
        if (err) {
            callback(err, null);
            return;
        }
        
        collection.find(a_data).toArray(function(err, arr) {
            if (err) {
                callback(err, null);
                return;
            }

            // 查询成功后返回结果
            callback(null, arr);
        });
    });
}

// 调用示例
select('your_collection_name', { your_query: 'your_value' }, function(err, result) {
    if (err) {
        console.error("查询失败:", err);
        return;
    }

    console.log("查询结果:", result);
});

代码解释

  1. 引入回调函数:我们将原来的 select 函数修改为接受一个额外的参数 callback。这个回调函数将在查询完成后被调用,并传递查询结果或错误信息。
  2. 处理错误:在每个异步操作中,我们检查是否有错误发生。如果有错误,我们立即调用回调函数并传递错误信息。
  3. 返回结果:如果查询成功,我们调用回调函数并传递查询结果。

通过这种方式,我们可以确保在查询完成之后再返回结果,而不是在查询开始之前就返回 false

希望这能解决你的问题!如果还有其他疑问,请随时提问。


5555555555那个前辈能指点下

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

还是没太懂啊

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

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

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

根据你的描述,问题出在异步函数的返回值上。在Node.js中,数据库操作是异步的,因此不能直接通过return语句将结果返回到外部作用域。你需要使用回调函数来处理异步操作的结果。

示例代码

function select(a_where, a_data, callback) {
    db_connector.collection(a_where, function (err, collection) {
        if (err) {
            callback(err, null);
            return;
        }
        
        collection.find(a_data).toArray(function (err, arr) {
            if (err) {
                callback(err, null);
                return;
            }
            
            callback(null, arr);
        });
    });
}

// 使用示例
select('your_collection', { key: 'value' }, function (err, result) {
    if (err) {
        console.error("查询失败:", err);
        return;
    }

    console.log("查询结果:", result);
});

解释

  1. 回调函数select 函数接受第三个参数 callback,这是一个函数,用于接收异步操作的结果。
  2. 错误处理:如果在数据库操作过程中发生错误(如连接错误或查询错误),应该立即调用 callback 并传递错误信息。
  3. 结果传递:如果操作成功,调用 callback 并传递查询结果。

这样,你就可以在调用 select 函数时传入一个回调函数,当查询完成后,结果会在这个回调函数中传递给你。

回到顶部