Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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');
выполнялось после всего вышеперечисленного?
Ответить с цитированием
  #2 (permalink)  
Старый 01.03.2013, 13:45
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

UPD. в приницпе разобрался с асинхронностью. но теперь не совсем понятно, как надо организовывать приложение.

например, подключение к базе — это отдельный модуль, который возвращает объект бд?

измененный модуль:

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

function resSend(res) {
  coll.find().toArray(function (err, docs) {
    res.send("{ response: " + JSON.stringify(docs) + " }");
  });
}

exports.get = function (req, res) {
  coll.count(function (err, count) {
    if (count === 0) {
      https.get('https://api.vk.com/method/friends.get?fields=uid,first_name,last_name&access_token=' + global['access_token'], function (d) {
        var chunk = '';
        d.on('data', function (data) {
          chunk += data;
        });
        d.on('end', function () {
          coll.insert(JSON.parse(chunk).response);
          resSend(res);
        });
      }).on('error', function (e) {
        console.error(e);
      });
    } else {
      resSend(res);
    }
  });
};

Последний раз редактировалось tadjik1, 01.03.2013 в 14:05.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
немного об nodejs qwermjk AJAX и COMET 5 15.02.2013 10:57
Nodejs и sqlite Octane Серверные языки и технологии 16 21.10.2012 23:18
Как кодить в online режиме на nodejs president Оффтопик 3 24.07.2012 03:42
NodeJS программист на постоянку, удаленно Eugene Decmhenko Работа 5 12.05.2012 12:46
Comet: NodeJS - с чего начать разработку? Vulkan AJAX и COMET 13 27.11.2010 19:25