2012-10-12 2 views
1

대학 과정이 방금 mongodb를 시작했으며 작업 할 과제가 있습니다. 지금까지 모든 것이 잘 진행되고있는 것 같지만 응답에 값을 반환하는 문제가 발생했습니다. 범위 문제는 항상 나를 괴롭히는 것 같습니다. 여기값을 반환 할 수 없습니다. (내가 믿는 범위 문제)

var querystring = require("querystring"), 
fs = require("fs"), 
mongodb = require('mongodb'), 
server = new mongodb.Server('localhost',27017, {auto_reconnect: true}), 
db = new mongodb.Db('testdb',server); 

db.createCollection('testCollection', {safe : true}, function(err, collection){}); 



function createData(response, postData) { 
    var fname = querystring.parse(postData).fname; 
    var lname = querystring.parse(postData).lname; 
    var phone = querystring.parse(postData).phone; 

    var info = {'fname':fname,'lname':lname,'phone':phone}; 
    var infojson = JSON.stringify(info); 
    var infojson = JSON.parse(infojson); 

    db.open(function(err, db) { 
      if(!err) { 
        db.collection('testCollection', function(err, collection) { 
          collection.insert(infojson, {safe : true}, function(err, result) { 
            if(err) { 
              console.log(err); 
            } else { 
              console.log(result); 
              db.close(); 
            } 
          }); 
        }); 
      } 
    return result; 
    }); 
response.writeHead(200, {"Content-Type": "text/plain"}); 
response.write("You have added " + result + " to the database."); 
response.end(); 
} 

나는 점점 오전 오류입니다 :

/home/ubuntu/151_final/requestHandlers.js:36 
response.write("You have added " + result + " to the database."); 
           ^
ReferenceError: result is not defined 
at Object.createData [as /createData] (/home/ubuntu/151_final/requestHandlers.js:36:40) 
at route (/home/ubuntu/151_final/router.js:4:19) 
at IncomingMessage.<anonymous> (/home/ubuntu/151_final/server.js:18:4) 
at IncomingMessage.EventEmitter.emit (events.js:85:17) 
at IncomingMessage._emitEnd (http.js:366:10) 
at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23) 
at Socket.socket.ondata (http.js:1690:22) 
at TCP.onread (net.js:402:27) 

답변

1

난 당신이 그냥 전화가 있음을의 범위 문제가 아닙니다

db.open(function(err, db) { 
      if(!err) { 
        db.collection('testCollection', function(err, collection) { 
          collection.insert(infojson, {safe : true}, function(err, result) { 
            if(err) { 
              console.log(err); 
            } else { 
              console.log(result); 
              db.close(); 
              response.writeHead(200, {"Content-Type": "text/plain"}); 
              response.write("You have added " + result + " to the database."); 
              response.end(); 
            } 
          }); 
        }); 
      } 

    }); 

해야 할 생각은 여기에 코드입니다 비동기이며 결과가 정의되지 않았습니다. 라인이 있기 때문에 정의되지 않았습니다.

response.write("You have added " + result + " to the database."); 

이 즉시 실행되고 다른 함수가 반환 될 때까지 기다리지 않습니다.

+0

범위도 마찬가지입니다. 비동기 특성으로 인해 값이 올바르지 않지만 변수 부족이 범위 문제입니다. –

+0

좋아요! 도움 Nicola 주셔서 감사합니다. 나는 그 전에 다른 모든 것의 바깥에서 반응을하는 데 너무 익숙해 있었고, 나는 그 것을 다른 사람에게 중첩 시키려고 생각하지 않았습니다. –

+0

글쎄 지금은 아무런 오류가 없지만, 이제는 "당신은 [object Object]를 데이터베이스에 추가했습니다." 그럼에도 불구하고 객체는 console.log 메시지에 잘 나타납니다. –

관련 문제