1

私の大学のコースはmongodbを調べ始めたばかりで、取り組むべき課題があります。これまでのところすべてが順調に進んでいるようですが、response.writeで値を返す問題が発生しました。スコープの問題は常に私を悩ませているもののようです。コードは次のとおりです。

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)
4

1 に答える 1

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.");

すぐに実行され、他の関数が戻るのを待ちません

于 2012-10-12T18:23:59.677 に答える