Всем привет. Наконец дошли руки до ноджс и на первом же этапе возникло тотальное непонимание происходящего. Серьезные проблемы с асинхронностью и прочим.
Т.к. я не знаю ни одного «серверного языка» и до этого никогда не писал серверные приложения, то абсолютно не понимаю как они должны быть устроены, как работать с базой, как с клиентскими запросами, и т.д.
В качестве примера взял простенькое приложение, которое должно уметь логинить пользователя вконтакте, спрашивать список его друзей, сохранять в базу и рисовать на странице табличкой. При следующем запросе отдавать данные уже из базы, без запроса сервера 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');
выполнялось после всего вышеперечисленного?