8

我能够在 nodejs 中从 neDB 数据库插入和检索数据。但是我不能将数据传递到检索​​它的函数之外。

我已经阅读了 neDB 文档,并搜索并尝试了不同的回调和返回组合(参见下面的代码),但没有找到解决方案。

我是 javascript 新手,所以我不知道我是否误解了一般如何使用变量,或者这个问题是否与专门使用 neDB 或两者有关。

有人可以解释为什么我的代码中的“x”不包含数据库中的文档 JSON 结果吗?我怎样才能让它工作?

 var fs = require('fs'),
    Datastore = require('nedb')
  , db = new Datastore({ filename: 'datastore', autoload: true });

    //generate data to add to datafile
 var document = { Shift: "Late"
               , StartTime: "4:00PM"
               , EndTime: "12:00AM"
               };

    // add the generated data to datafile
db.insert(document, function (err, newDoc) {
});

    //test to ensure that this search returns data
db.find({ }, function (err, docs) {
            console.log(JSON.stringify(docs)); // logs all of the data in docs
        });

    //attempt to get a variable "x" that has all  
    //of the data from the datafile

var x = function(err, callback){
db.find({ }, function (err, docs) {
            callback(docs);
        });
    };

    console.log(x); //logs "[Function]"

var x = db.find({ }, function (err, docs) {
        return docs;
    });

    console.log(x); //logs "undefined"

var x = db.find({ }, function (err, docs) {
    });

    console.log(x); //logs "undefined"*
4

3 回答 3

6

回调在 JavaScript 中通常是异步的,这意味着您不能使用赋值运算符,因此您不会从回调函数返回任何内容。

当您调用程序的异步函数执行时,会继续执行“var x = 不管”语句。对变量的赋值,接收到的任何回调的结果,您需要从回调本身内部执行......你需要的是......

var x = null;
db.find({ }, function (err, docs) {
  x = docs;
  do_something_when_you_get_your_result();
});

function do_something_when_you_get_your_result() {
  console.log(x); // x have docs now
}

编辑

是一篇关于异步编程的不错的博客文章。您可以获取有关此主题的更多资源。

是一个流行的库,可帮助节点进行异步流控制。

PS
希望这会有所帮助。请务必询问您是否需要澄清一些事情:)

于 2013-10-08T07:26:44.203 回答
5

我遇到了同样的问题。最后,我使用了 async-await 和 promise 之间的组合来解决它。

在您的示例中,以下将起作用:

var x = new Promise((resolve,reject) {
    db.find({ }, function (err, docs) {
        resolve(docs);
    });
});

console.log(x);
于 2020-03-27T15:18:03.517 回答
0

我必须学习一些关于异步函数的知识才能让它正确。对于那些正在寻求从 nedb 获取返回值的具体帮助的人,这里有一个对我有用的片段。我在电子中使用它。

function findUser(searchParams,callBackFn)
{
    db.find({}, function (err, docs))
    {
        //executes the callback
        callBackFn(docs)
    };
}

usage

findUser('John Doe',/*this is the callback -> */function(users){
    for(i = 0; i < users.length; i++){
        //the data will be here now
        //eg users.phone will display the user's phone number
    }})
于 2017-09-05T07:17:37.523 回答