Тема: nodejs + mongodb
Показать сообщение отдельно
  #1 (permalink)  
Старый 01.03.2013, 13:18
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

nodejs + mongodb
Всем привет. Наконец дошли руки до ноджс и на первом же этапе возникло тотальное непонимание происходящего. Серьезные проблемы с асинхронностью и прочим.
Т.к. я не знаю ни одного «серверного языка» и до этого никогда не писал серверные приложения, то абсолютно не понимаю как они должны быть устроены, как работать с базой, как с клиентскими запросами, и т.д.

В качестве примера взял простенькое приложение, которое должно уметь логинить пользователя вконтакте, спрашивать список его друзей, сохранять в базу и рисовать на странице табличкой. При следующем запросе отдавать данные уже из базы, без запроса сервера vk.

Клиентская часть делается на основе backbone-boilerplate, серверная (т.е. я плохо знаю инструменты ноды) на node.js и express (с jade, который мне очень не нравится, думаю перейти на ejs).

Итак, запрос за друзьями на клиенте

var coll = new Backbone.Collection.extend({ model: model, url: '/api/friends' });
coll.fetch();


на сервере это дело слушает роутер, и передаёт обработку в модуль friends:
app.get('/api/friends', friends.get);


так как я не представляю как правильно организуются приложения на ноде, я прям в модуле делаю подключение к базе и пытаюсь обработать запрос в функции get:

/*
 * GET friends
 */
var https = require('https'),
  Db = require('mongodb').Db,
  Server = require('mongodb').Server;

var client = new Db('data', new Server('127.0.0.1', 27017, {})),
  coll;

client.open(function (err, pClient) {
  pClient.collection('friends', function (err, collection) {
    coll = collection;
  });
});
exports.get = function (req, res) {
  coll.count(function (err, count) {
    if (count === 0) {
      https.get('https://api.vk.com/method/friends.get?access_token=' + global['access_token'], function (d) {
        var chunk = '';
        d.on('data', function (data) {
          chunk += data;
        });

        d.on('end', function () {
          var response = JSON.parse(chunk).response;
          response.each(function (friend) {
            coll.insert(friend);
          });
        });
      }).on('error', function (e) {
        console.error(e);
      });
    }
    console.log(coll.find().toArray());
    res.send('asdasd');
  });

};


вся эта ерунда конечно же не работает, птому что я упорно не могу понять как решить проблемы, связанные с асинхронностью. ведь всё, чот тут происходит (работа с базой, запрос на сервер, обработка результатов) — всё асинхронно.

вот вопрос, каким образом переписать код, чтобы
res.send('asdasd');
выполнялось после всего вышеперечисленного?
Ответить с цитированием