首页 > 解决方案 > 如何在 Node JS 中的回调之外使用变量?

问题描述

我对节点 js 不切实际。我有以下代码:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("mydb");

    dbo.collection("test").findOne(
        {},
        { sort: { _id: -1 } },
        (err, data) => {
            console.log(data);
        },
    );
    db.close();
});

我想在 MongoClient.connect() 的范围之外使用变量“数据”。问题应该是使用了回调函数,因此是异步执行的。

如果我做这样的事情:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

var x;

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("mydb");

    dbo.collection("test").findOne(
        {},
        { sort: { _id: -1 } },
        (err, data) => {
            console.log(data);
            x = data;
        },
    );
    db.close();
});

console.log(x);

x 的结果将是“未定义的”。

一般如何解决这个问题?您如何使用特定范围之外的变量以伪同步方式执行代码?

标签: node.jsmongodb

解决方案


您可以使用 async 并等待将此异步代码转换为同步代码,

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

var x;

(async ()=>{
 await MongoClient.connect(url, (err, db) => {
    if (err) throw err;
    var dbo = db.db("mydb");

    dbo.collection("test").findOne(
        {},
        { sort: { _id: -1 } },
        (err, data) => {
            console.log(data);
            x = data;
        },
    );
    db.close();
});
})();
console.log(x);

了解更多,

https://tylermcginnis.com/async-javascript-from-callbacks-to-promises-to-async-await/ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/异步函数


推荐阅读