te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - Get node.js neDB data into a variable - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Get node.js neDB data into a variable - Stack Overflow

programmeradmin2浏览0评论

I am able to insert and retrieve data from an neDB database in nodejs. But I cannot pass the data outside of the function that retrieves it.

I have read through the neDB documentation and I searched for and tried different binations of callbacks and returns (see code below) without finding a solution.

I'm new to javascript so I do not know if I am misunderstanding how to use variables in general or if this issue is related to using neDB specifically or both.

Could someone please explain why "x" in my code does not ever contain the docs JSON results from the database? How can I make it work?

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

I am able to insert and retrieve data from an neDB database in nodejs. But I cannot pass the data outside of the function that retrieves it.

I have read through the neDB documentation and I searched for and tried different binations of callbacks and returns (see code below) without finding a solution.

I'm new to javascript so I do not know if I am misunderstanding how to use variables in general or if this issue is related to using neDB specifically or both.

Could someone please explain why "x" in my code does not ever contain the docs JSON results from the database? How can I make it work?

 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"*
Share Improve this question asked Oct 8, 2013 at 6:14 curtwphillipscurtwphillips 5,8111 gold badge22 silver badges19 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 6

Callbacks are generally asynchronous in JavaScript meaning you can not use assignment operator, consequently you do not return anything from the callback function.

When you call an async function execution of you programme carries on, passing the 'var x = whatever' statement. The assignment to a variable, the result of whatever callback is received, you need to perform from within the callback itself... what you need is something in the lines of ...

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 is a nice blog post about asynchronous programming. And there is a lot more resources on this topic that you can pick up.

This is a popular library to help with async flow-control for node.

P.S.
Hope this helps. Please, by all means ask if you need something clarified :)

I ran into the same problem. In the end I used a bination between async-await and a promise with resolve to solve it.

In your example the following would work:

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

console.log(x);

I had to learn a bit about async functions to get it right. For those who are looking for specific help about getting a return value from nedb, here's a snippet of what worked for me. I was using it in electron.

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
    }})
发布评论

评论列表(0)

  1. 暂无评论