2014-05-13 1 views
7

Express, Node.js 및 MongoDB (mongojs 사용)를 사용하는 애플리케이션을 작성하고 있습니다. 모듈 db.jsserver.js이 있으며 아래에 스 니펫이 있습니다.Express를 사용하여 MongoDB 쿼리 결과를 JSON으로 전송

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

그것의 작동 당신이 볼 수 있듯이, 때문에, 나는 callback.json(data)을 때 내가해야 사용 (아마 잘못) 해요 callback(data)을 사용하고 있습니다. db.js 모듈이 응답을 보내지 않아야하며 내 함수의 콜백으로 res.json을 전달해야한다고 생각합니다.

문제는 : 나는 것들을 내가 바로 생각하는 방법을 수행 할 때, 나는 다음과 같은 오류에 직면

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) 

어떻게 제대로 내 DB 모듈에 응답 객체를 전송하지 않고 JSON 응답을 보낼 수 있습니까?

P. 라인 36의 내용이 db.js 일 때 변경하면 callback(data);이됩니다.

답변

2

당신이 맞다면 db.jsres을 호출하거나 그것에 대해 알면 안됩니다. 그것을 분리시켜 두는 것이 좋다.

이 (안된를) 다음은

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

두 전반적인 문제 :

첫째, db.js fi 르 같은 것을 수행해야합니다

callback(err, data); 

둘째, 당신의 server.js 호출이 보일 것 같이 더 많은 :

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

데이터베이스 호출 될 때까지 아무것도 읽을 수 없기 때문에 db.getUsersByCity 호출이 비동기 콜백입니다. 나는 너무 많은 오류를 읽지 않았다.

관련 문제