Синхронный вызов NodeJS

0

Я пытаюсь получить количество записей из базы данных с помощью 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"
  • 1
    Ваша проблема связана с асинхронной природой используемого вами коннектора базы данных. Если этот разъем не обеспечивает синхронную альтернативу, то, что вы пытаетесь сделать, не может быть сделано.
  • 0
    действительно :( это нельзя сделать ???
Показать ещё 5 комментариев
Теги:

2 ответа

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 переменные.

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню