NodeJS同步调用

时间:2015-01-05 18:00:32

标签: javascript php node.js

我正在尝试使用nodejs从数据库中获取记录数,但问题是由于同步请求,我无法打印它们。当我尝试在函数内部打印时,它打印得很好,但在函数之外,它没有。我知道这是由于JS的同步行为,但我想这样做(可能是异步)。我是Javascript和nodejs的新手,所以请指导我如何做到这一点。这是代码。

router.post('/numofrecs', function(req, res) {

        var db = new Db('nmydb', new Server('localhost', '27017'));
        db.open(function (err, db) {
        db.authenticate('', '', function (err, result) {


            var url = 'mongodb://localhost:27017/nmydb';
            client.connect(url, function (err, db) {
                que = new Array();
                var questioncol = db.collection('allquestions');
                questioncol.find({}).count(function (err, data) {
                    rec = data;
                    console.log("Num of rec:"+rec);
                    //inside the connect function , it prints fine here
                });

                console.log('Num of rec:'+ rec);


//but it doesnot print here outside the connect function and just print "undefined"

2 个答案:

答案 0 :(得分:1)

由于您正在构建HTTP服务器,因此您不希望在服务器上执行任何同步操作,因为此类操作会导致服务器在同步操作期间对所有客户端无响应。相反,您应该在db查询的回调中完成所需的工作。

router.post('/numofrecs', function(req, res) {
    var db = new Db('nmydb', new Server('localhost', '27017'));
    db.open(function (err, db) {
        db.authenticate('', '', function (err, result) {
            var url = 'mongodb://localhost:27017/nmydb';
            client.connect(url, function (err, db) {
                var que = new Array();
                var questioncol = db.collection('allquestions');
                questioncol.find({}).count(function (err, data) {
                    console.log("Num of rec:"+data);
                    // do stuff with data here.
                    doStuff(data);
                });
            });
        });
    });
});

不要忘记var您的变量。

答案 1 :(得分:0)

npm install -g xd-synchttp

const sync = require('xd-synchttp');
let content = "";
let post_data={'a':1,'b':2};
try{
    content = sync.http_get('http://www.csdn.net',3);
    console.log(sync.http_post('http://www.baidu.com',post_data,0));
}
catch(err){
console.log(err);
}