Return MongoDB 查询结果作为变量而不是控制台
Return MongoDB query result as variable instead of to console
在名为 db_to_var.js
的 javascript 文件中,我有以下函数成功打印数组 return 通过查询数据库 test_db
,到 console.log()
。 (例如,名为 cars
的数据库有一个关键字 name
描述了品牌名称,例如 toyota, hyunday,volvo
。)该方法被调用:console.log("listCars function call="+listCars());
并包含:
function listCars() {
car_and_name_grandparent = MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("testdb");
car_and_name_parent = dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray(function(err, result) {
if (err) throw err;
car_and_name = result;
db.close();
console.log("car_and_name="+car_and_name);
return car_and_name;
});
return car_and_name_parent;
});
return car_and_name_grandparent;
};
但是,car_and_name_parent
仍未定义,因为正确填写的 car_and_name
实际上并未 return 编辑到 car_and_name_parent
。这促使我进行调查,我调查了:
The documentation of .toArray()
,一开始就不应该有争论。因此,我检查了 dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray()
实际上是 return,这是一个 [object Promise]
。
1.a 不能直接计算 Promise
,必须使用 then
、await
或 async
.
1.b 我可以将 Promise
转换成 function then() { [native code] }
使用 .then
但我还没有找到如何进一步评估它
从“[native code]
”中检索列表的表达式。这
await
returns 错误说 SyntaxError: await is only valid in
async function
,而 async car_and_name.then
returns 错误
SyntaxError: Unexpected identifier
.
我也试过将名为carNames
的全局变量传递给函数,并为其赋值car_and_name
,但我目前无法成功传递全局变量在 .toArray(..)
内部,因为 console.log(carNames);
在我这样做时未定义,在那个位置。
如何return将car_and_name
变量转换为函数外的变量listCars()
?
下面是使用 async await 的方法。
async function listCars() {
let db = await MongoClient.connect(url);
let dbo = db.db("testdb");
return await dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray()
}
listCars().then(cars => {
console.log(cars); //You will get your results here
})
nodejs 中的 mongoDB 查询像上面的查询是异步的,所以你不能直接在变量中获取 return 值。您要么必须使用回调函数,要么 .then()
像上面的示例一样使用承诺。
您使用的 toArray() 函数是一种 MongoDB 方法,您在问题中提到的是一种 jQuery 方法。这是供您参考的正确文档 -> https://docs.mongodb.com/manual/reference/method/cursor.toArray/
希望对您有所帮助!
您的方法正在进行异步调用,该调用会在检索到您要查找的值之前立即作为 Promise 执行。
我建议将您的方法包装在一个承诺中。
function listCars() {
return new Promise((resolve, reject) => {
MongoClient.connect(url, function(err, db) {
if (err) reject(err);
var dbo = db.db("testdb");
dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray(function(err, result) {
if (err) reject(err);
db.close();
resolve(result);
});
});
})
};
那你就可以这样用了。
listCars()
.then(carNames => {
// Use your variable here.
})
.catch(err => throw err);
您也可以像这样在异步方法中使用 listCars 作为辅助方法。
const carWork = async function() {
try {
const carNames = await listCars();
// ....
} catch (err) {
throw err;
}
}
您可以使用 async/await。但是你没有正确使用它。您收到语法错误,提示您只能在异步函数中使用 await。所以你可以这样写你的代码,
async function listCars() {
try{
db = await MongoClient.connect(url);
var dbo = db.db("testdb");
car_and_name_parent = await dbo.collection("cars").find({}, {
projection: { _id: 0, name: 1} }).toArray();
return car_and_name_parent
}catch(err){
throw err;
}
};
在名为 db_to_var.js
的 javascript 文件中,我有以下函数成功打印数组 return 通过查询数据库 test_db
,到 console.log()
。 (例如,名为 cars
的数据库有一个关键字 name
描述了品牌名称,例如 toyota, hyunday,volvo
。)该方法被调用:console.log("listCars function call="+listCars());
并包含:
function listCars() {
car_and_name_grandparent = MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("testdb");
car_and_name_parent = dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray(function(err, result) {
if (err) throw err;
car_and_name = result;
db.close();
console.log("car_and_name="+car_and_name);
return car_and_name;
});
return car_and_name_parent;
});
return car_and_name_grandparent;
};
但是,car_and_name_parent
仍未定义,因为正确填写的 car_and_name
实际上并未 return 编辑到 car_and_name_parent
。这促使我进行调查,我调查了:
The documentation of
.toArray()
,一开始就不应该有争论。因此,我检查了dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray()
实际上是 return,这是一个[object Promise]
。1.a 不能直接计算
Promise
,必须使用then
、await
或async
.1.b 我可以将
Promise
转换成function then() { [native code] }
使用.then
但我还没有找到如何进一步评估它 从“[native code]
”中检索列表的表达式。这await
returns 错误说SyntaxError: await is only valid in async function
,而async car_and_name.then
returns 错误SyntaxError: Unexpected identifier
.我也试过将名为
carNames
的全局变量传递给函数,并为其赋值car_and_name
,但我目前无法成功传递全局变量在.toArray(..)
内部,因为console.log(carNames);
在我这样做时未定义,在那个位置。
如何return将car_and_name
变量转换为函数外的变量listCars()
?
下面是使用 async await 的方法。
async function listCars() {
let db = await MongoClient.connect(url);
let dbo = db.db("testdb");
return await dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray()
}
listCars().then(cars => {
console.log(cars); //You will get your results here
})
nodejs 中的 mongoDB 查询像上面的查询是异步的,所以你不能直接在变量中获取 return 值。您要么必须使用回调函数,要么 .then()
像上面的示例一样使用承诺。
您使用的 toArray() 函数是一种 MongoDB 方法,您在问题中提到的是一种 jQuery 方法。这是供您参考的正确文档 -> https://docs.mongodb.com/manual/reference/method/cursor.toArray/
希望对您有所帮助!
您的方法正在进行异步调用,该调用会在检索到您要查找的值之前立即作为 Promise 执行。
我建议将您的方法包装在一个承诺中。
function listCars() {
return new Promise((resolve, reject) => {
MongoClient.connect(url, function(err, db) {
if (err) reject(err);
var dbo = db.db("testdb");
dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray(function(err, result) {
if (err) reject(err);
db.close();
resolve(result);
});
});
})
};
那你就可以这样用了。
listCars()
.then(carNames => {
// Use your variable here.
})
.catch(err => throw err);
您也可以像这样在异步方法中使用 listCars 作为辅助方法。
const carWork = async function() {
try {
const carNames = await listCars();
// ....
} catch (err) {
throw err;
}
}
您可以使用 async/await。但是你没有正确使用它。您收到语法错误,提示您只能在异步函数中使用 await。所以你可以这样写你的代码,
async function listCars() {
try{
db = await MongoClient.connect(url);
var dbo = db.db("testdb");
car_and_name_parent = await dbo.collection("cars").find({}, {
projection: { _id: 0, name: 1} }).toArray();
return car_and_name_parent
}catch(err){
throw err;
}
};