2014-05-13 15 views
7

Sto scrivendo un'applicazione in cui utilizzo express, Node.js e MongoDB (usando mongojs). Ho un modulo db.js e un server.js, che hanno i frammenti di seguito.Invia risultato query MongoDB come JSON utilizzando express

db.js

var getUsersByCity = function(city, callback) { 
    db.users.find({'city': city}).toArray(function(err, data) { 
     if (err) { 
      callback(err); 
      console.log(err); 
     } else { 
      console.log(data); 
      callback.json(data); 
     } 
    }); 
} 

server.js

app.post("/get_users_list", function(req, res) { 
    var body = req.body; 
    db.getUsersByCity(body.city, res); 
}); 

che sta funzionando perché, come potete vedere, io sono (probabilmente in modo non corretto) usando callback.json(data), quando dovrebbe usare callback(data). Penso che il modulo db.js non dovrebbe essere responsabile per l'invio della risposta e dovrei passare res.json come richiamata alla mia funzione.

Il problema è: quando faccio le cose nel modo che considero giusto, mi faccia il seguente errore:

path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/base.js:245 
     throw message;  
      ^
TypeError: Cannot call method 'get' of undefined 
    at res.json (path_to_my_app/node_modules/express/lib/response.js:189:22) 
    at path_to_my_app/db.js:36:13 
    at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/cursor.js:163:16 
    at commandHandler (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/cursor.js:706:16) 
    at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/db.js:1843:9 
    at Server.Base._callHandler (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/base.js:445:41) 
    at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/server.js:468:18 
    at MongoReply.parseBody (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5) 
    at null.<anonymous> (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/server.js:426:20) 
    at EventEmitter.emit (events.js:95:17) 

Come inviare correttamente la risposta JSON senza inviare l'oggetto risposta al mio modulo DB?

P.S. Il contenuto della riga 36 di db.js, quando apporto le modifiche, è callback(data);.

risposta

2

Hai ragione che lo db.js non deve chiamare res o nemmeno saperlo. È bene tenerlo separato.

A seguito di questo (non testata):

db.js

var getUsersByCity = function(city, cb) { 
     db.users.find({'city': city}).toArray(cb); 
    } 

server.js

app.post("/get_users_list", function(req, res) { 
     var body = req.body; 
     db.getUsersByCity(body.city, function(err, data){ 
      if (err) { 
       console.log(err); 
       return res(err); 
      } else { 
       console.log(data); 
       return res.json(data); 
      } 
     }); 
    }); 
2

due problemi generali che vedo:

In primo luogo, il tuo db.js fi le deve fare qualcosa di simile:

callback(err, data); 

In secondo luogo, la chiamata server.js dovrebbe essere più simile a:

db.getUsersByCity(body.city, function(err, data){ 
    if(err){ 
     res.send(500, "something went wrong"); 
    }else{ 
     res.json(data); 
    } 
}); 

La chiamata db.getUsersByCity è asincrona perché non si può leggere qualsiasi cosa fino a quando la chiamata di database ritorna al suo richiamo. Non ho letto troppo dell'errore però ... Vedi se questo cancella tutto.