Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Node.js > Получение данных из MongoDB на Node.js


Автор: Demonoid 3.2.2013, 16:01
Жизнь в некоторых лицах заставила из тепленького, уютного PHP погрузиться в суровый JavaScript в исполнении Node.js. При выполнении ниже приведенного кода выдает ошибку "can't set headers after they are sent" Так понял, что кука не отправляется в виду невозможности изменения внешней переменной res. А как же тогда отправить куку? Или хотябы вывести хоть какую-нибудь переменную из анонимной функции. 

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

Код

var express=require('express');
var app=express.createServer();

app.configure(function(){
app.use(express.bodyParser());
app.use(express.cookieParser("SDFSF"));
})
app.use(express.cookieSession());

var mongo=require('mongodb').MongoClient;

function change_status(req,res) {
    var db=mongo.connect("mongodb://localhost:27017/shop", function(err, db) 
     {
        var collect_users = db.collection('users');

        collect_users.find().toArray(function(err,items)
        {           
            if(items[0]['hash']==req.cookies.hash)
            {
                res.cookie('status','active', { maxAge: 1000*60*10 });
            }
            else
            {       
                res.cookie('status','noactive', { maxAge: 1000*60*10 });
            }   
        });
    });
};

app.get("/",function(req,res){
change_status(req,res);
res.send("erewrwerew");
})

app.listen(2012);

Автор: Shogun 8.2.2013, 02:05
Вам нужно почитать про основы асинхроного программирования.

В вашем коде получается что кукисы отправляются уже после ответа так как данные выбираются асинхронно из базы, поэтому и ошибка.

А должно быть как-то так:
Код

function change_status(req, res, callback) {
    var db=mongo.connect("mongodb://localhost:27017/shop", function(err, db) 
     {
        var collect_users = db.collection('users');
        collect_users.find().toArray(function(err,items)
        {           
            if(items[0]['hash']==req.cookies.hash)
            {
                res.cookie('status','active', { maxAge: 1000*60*10 });
            }
            else
            {       
                res.cookie('status','noactive', { maxAge: 1000*60*10 });
            }   

            callback();
        });
    });
};

change_status(req,res, function() {
  res.send("erewrwerew");
});


И соединение с базой нет неабходимости делать при каждом запросе, node.js запускается один раз, тогда и подключайте базу и в запросах используйте это соединение.
+ Намного Вам легче будет работать с Mongoose для MongoDB.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)