即使在Express Js,mongo db中定义后,Javascript变量仍未定义

时间:2016-10-24 02:26:13

标签: javascript node.js mongodb express datatables

最近我开始尝试使用Node.js和Express.js。我正在构建一个微应用程序,它从Mongo Db接收数据,并使用服务器端示例在前端使用Jquery数据表进行显示。

我能够获得所需的数据。但每当我重新启动应用程序时,我都无法获得记录的总计数,并且变量未定义。再次重新加载页面后,我得到了计数。某种程度上是javascript的新手似乎我犯了一些与变量作用域或访问函数内部变量有关的错误。所以为了解决它,我甚至在快递js应用程序中创建了回调。有些功能正在运行,有些则没有。以下是获取文档中计数的代码:

//calling the functions here in the express js app
app.get('/tweets/', function(req, res){
    var countWithoutFilters;
    var countTwitter;
    var page        =  parseInt(req.query.start);
    var limit       =  parseInt(req.query.length);
    var skip        =  page; 
    var searchQuery = {};
    searchQuery = req.query.search.value;
    searchQuery = (searchQuery == '' || searchQuery == undefined) ? {}:searchQuery;
    var searchId = parseInt(searchQuery);
    countNumberOfRowsInTweets(function(data){
        countWithoutFilters = data;
    });
countNumberOfRowsInTweetsAfterFilters(searchQuery, function(data)    {
    countTwitter = data;
});
    queryTweetsCollection(searchQuery, limit, skip, function(data){
        res.send({
            draw: req.query.draw,
            recordsTotal: countTwitter,
            recordsFiltered: countTwitter,
            data: data, 
            page: parseInt(page)
        });
    });

});

//function to get tweets from the document and count the length
function countNumberOfRowsInTweets(callback)
{
    db.collection('tweets').find().toArray(function(err,  result){
        if(err)
            return console.log(err);
        callback(result.length);
    }); 
}
//count the items after applying filters
function countNumberOfRowsInTweetsAfterFilters(searchQuery, callback)
{
    console.log("Filtered row:"+searchQuery);
    var searchId = parseInt(searchQuery);
    db.collection('tweets').find({ $or: [{text: new RegExp(searchQuery, 'i')}, {id: searchId}]}).toArray(function(err,  result){
        if(err)
            return console.log(err);
        callback(result.length);
    }); 
}

我不知道任何其他方法,我确实尝试过变量提升和闭包等概念。

请尽可能帮助我找到正确的解决方案。

由于

2 个答案:

答案 0 :(得分:0)

这是因为javascript是异步的

此代码首先执行

queryTweetsCollection(searchQuery, limit, skip, function(data){
    res.send({
        draw: req.query.draw,
        recordsTotal: countTwitter,
        recordsFiltered: countTwitter,
        data: data, 
        page: parseInt(page)
    });
});
在填写

的计数变量之前

countWithoutFilters = data;
countTwitter = data;

答案 1 :(得分:0)

countNumberOfRowsInTweetscountNumberOfRowsInTweetsAfterFilters是异步的,您可以通过使用回调来适当处理 - 但是,在调用填充countWithoutFilterscountTwitter的函数后,您可以使用这些那些异步函数之前的变量有机会完成

以下代码应修复

countNumberOfRowsInTweets(function(countWithoutFilters){
    countNumberOfRowsInTweetsAfterFilters(searchQuery, function(countTwitter){
        queryTweetsCollection(searchQuery, limit, skip, function(data){
            res.send({
                draw: req.query.draw,
                recordsTotal: countTwitter,
                recordsFiltered: countTwitter,
                data: data, 
                page: parseInt(page)
            });
        });
    });
});