2013-10-08 1 views
6

Я могу вставлять и извлекать данные из базы данных neDB в nodejs. Но я не могу передавать данные вне функции, которая ее извлекает.Получить данные node.js neDB в переменную

Я прочитал документацию neDB, и я искал и пробовал различные комбинации обратных вызовов и возвратов (см. Код ниже), не найдя решение.

Я новичок в javascript, поэтому не знаю, не понимаю ли я, как использовать переменные вообще или эта проблема связана с использованием neDB специально или и тем, и другим.

Не могли бы вы объяснить, почему «x» в моем коде никогда не содержит результаты JSON docs из базы данных? Как я могу заставить его работать?

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"* 

ответ

6

Callbacks, как правило, асинхронный в JavaScript означает, что вы не можете использовать оператор присваивания, поэтому вы ничего не возвращаете из функции обратного вызова.

Когда вы вызываете функцию async-функции, выполняемую вашей программой, передавая инструкцию «var x = whatever». Присвоение переменной, результат любой обратный вызов получен, вы должны выполнить внутри самого обратного вызова ... что вам нужно что-то в линиях ...

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 
} 

EDIT

Here - хорошее сообщение в блоге об асинхронном программировании. И на эту тему есть намного больше ресурсов, которые вы можете подобрать.

This - популярная библиотека, которая поможет с асинхронным управлением потоком для узла.

P.S.
Надеюсь, это поможет. Пожалуйста, непременно спросите, нужно ли вам что-то уточнить :)

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 
    }}) 
Смежные вопросы