Javascript 无法返回值(我认为是范围问题)

Javascript 无法返回值(我认为是范围问题),javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我的大学课程刚开始复习mongodb,我们有一个作业要做。到目前为止,一切似乎都进展顺利,但我在回复中遇到了一个返回值的问题。范围问题似乎总是困扰着我。代码如下: var querystring = require("querystring"), fs = require("fs"), mongodb = require('mongodb'), server = new mongodb.Server('localhost',27017, {auto_reconnect: true}), db =

我的大学课程刚开始复习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)
/home/ubuntu/151_final/requestHandlers.js:36
写(“您已将“+result+”添加到数据库中。”);
^
ReferenceError:未定义结果
在Object.createData[as/createData](/home/ubuntu/151_final/requestHandlers.js:36:40)
在路线上(/home/ubuntu/151_final/router.js:4:19)
在收到消息时。(/home/ubuntu/151_final/server.js:18:4)
在IncomingMessage.EventEmitter.emit(events.js:85:17)
在IncomingMessage._emittend(http.js:366:10)
在HTTPParser.parserOnMessageComplete[作为onMessageComplete](http.js:149:23)
位于Socket.Socket.ondata(http.js:1690:22)
在TCP.onread(net.js:402:27)
我想你应该这样做

  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.");
立即执行,它不会等待其他函数返回

我认为您应该这样做

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

立即执行,它不会等待其他函数返回

范围。由于异步性质,值可能不正确,但缺少变量是一个范围问题;-)伟大的谢谢你的帮助,尼古拉。在此之前,我非常习惯于将响应置于其他所有响应之外,我不想将它们嵌套在else中。我现在没有收到任何错误,但现在我得到了“您已将[object object]添加到数据库中。”但该对象在console.log消息中显示良好。@Daniellach这是因为结果是一个对象。要显示属性,必须使用
result.rows
(或任何属性名称),如果要在客户端显示整个对象,该怎么办?我可以写回infojson对象,但它会丢失mongodb创建的_id键/值对。当然,范围也是如此。由于异步性质,值可能不正确,但缺少变量是一个范围问题;-)伟大的谢谢你的帮助,尼古拉。在此之前,我非常习惯于将响应置于其他所有响应之外,我不想将它们嵌套在else中。我现在没有收到任何错误,但现在我得到了“您已将[object object]添加到数据库中。”但该对象在console.log消息中显示良好。@Daniellach这是因为结果是一个对象。要显示属性,必须使用
result.rows
(或任何属性名称),如果要在客户端显示整个对象,该怎么办?我可以写回infojson对象,但它会丢失mongodb创建的_id键/值对。