2015-01-17 4 views
2

Хорошо, поэтому в последние несколько дней я начал возиться с узлом (потому что я думаю, что должен научиться чему-то действительно полезному и мог бы получить мне работу). Сейчас я знаю, как обслуживать страницы, базовую маршрутизацию и т. Д. Ницца. Но я хочу узнать, как запрашивать базы данных для получения информации.Извлечение данных из MongoDB с помощью NodeJS с помощью Express

Прямо сейчас, я пытаюсь создать приложение, которое будет служить веб-сайтом. Таким образом, в теории, приложение должно запрашивать базу данных при вводе в URL http://localhost:3000/comic/<comicid>

Я следующий код в моем app.js файле:

router.get('/', function(req, res) { 
    var name = getName(); 
    console.log(name); // this prints "undefined" 

    res.render('index', { 
     title: name, 
     year: date.getFullYear() 
    }); 
}); 

function getName(){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    var returnable_name; 
     if (objs.length == 1) 
     { 
      returnable_name = objs[0].name; 
      console.log(returnable_name); // this prints "Renato", as it should 
      return returnable_name; 
     } 
    }); 
} 

С этой установкой я console.log(getName()) к выходу " undefined "в консоли, но я понятия не имею , почему он не получает единственный элемент, который запрос действительно может найти в базе данных.

Я попытался найти в SO и даже для примера в Google, но не успел.

Как, черт возьми, я должен получить имя параметра от объекта?

ответ

1

NodeJs is асинхронный. Вам нужен обратный вызов или Promise.

router.get('/', function(req, res) { 
    var name = ''; 
    getName(function(data){ 
     name = data; 
     console.log(name); 

     res.render('index', { 
      title: name, 
      year: date.getFullYear() 
     }); 
    }); 
}); 

function getName(callback){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
     var returnable_name; 
     if (objs.length == 1) 
     { 
      returnable_name = objs[0].name; 
      console.log(returnable_name); // this prints "Renato", as it should 
      callback(returnable_name); 
     } 
    }); 
} 
+0

Это работает (как в приложении не сбой, а индексная страница отображается в браузере), но заголовок не установлен. По крайней мере, не для меня, в моем тесте. Заголовок просто становится пустым и по умолчанию используется «localhost: 3000». –

+0

У вас есть рендер на обратном вызове? – MaximeF

+0

Я не понимаю, что вы имеете в виду. Код выглядит так же, как ваш. Получение информации из getName, присвоение ей имени и последующего использования в res.render(). –

1

getName функция делает асинхронный вызов Монго с db.test.find. Вы можете увидеть это, добавив console.log после функции async. Как это:

function getName(){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    var returnable_name; 
    if (objs.length == 1) { 
     returnable_name = objs[0].name; 
     console.log(returnable_name); 
     return returnable_name; 
    } 
    }); 
    console.log('test'); // <!-- Here 
} 

Во всех подобию, этот выход:

test 
Renato 

Вы должны предоставить обратный вызов вашей getName функции.

router.get('/', function(req, res) { 
    getName(function(err, name) { 
    res.render('index', { 
     title: name, 
     year: date.getFullYear() 
    }); 
    })' 
}); 

function getName(cb){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    if(err) cb(err); 
    var returnable_name; 
    if (objs.length == 1) { 
     returnable_name = objs[0].name; 
     return cb(null, returnable_name); 
    } else { 
     // Not sure what you want to do if there are no results 
    } 
    }); 
}