异步/等待JavaScript(使用MongoDb)
我正在使用MongoDB,有一个连接和一个可以工作的客户端。运行以下代码时,您可以console.log()查看结果并查看正确的输出:异步/等待JavaScript(使用MongoDb),javascript,mongodb,asynchronous,Javascript,Mongodb,Asynchronous,我正在使用MongoDB,有一个连接和一个可以工作的客户端。运行以下代码时,您可以console.log()查看结果并查看正确的输出: connect.then(async () => { const dbo = client.db(prod == 1 ? "prodData" : "test"); let data = await dbo.collection("practitioners").findOne({
connect.then(async () => {
const dbo = client.db(prod == 1 ? "prodData" : "test");
let data = await dbo.collection("practitioners").findOne({"_id" : "Oq1tOesempf3jjLfrVrWaVtaROI3"}, function(err, result) {
if (err) throw err;
console.log(result); // works!!!
return result;
});
});
然而,我试图在函数之外获得结果,但我无法理解其中的wait/async部分,或者如何作为一个承诺来实现它。我已经在这方面摸索了很长时间,非常感谢您的帮助:
const find = async (connect, client, prod = 0) => {
// this works
// let data2 = await axios.get('https://reqres.in/api/users?page=2');
// console.log(data2);
let data = await connect.then(async () => {
const dbo = client.db(prod == 1 ? "prodData" : "test");
await dbo.collection("practitioners").findOne({"_id" : "Oq1tOesempf3jjLfrVrWaVtaROI3"}, function(err, result) {
if (err) throw err;
return result;
});
});
console.log(data); // undefined should be value :(
return data;
}
如果您可以从响应之外获取数据,即使这样也可能有所帮助:
connect.then(() => {
const dbo = client.db(prod == 1 ? "prodData" : "test");
let data = await dbo.collection("practitioners").findOne({"_id" : "Oq1tOesempf3jjLfrVrWaVtaROI3"}, function(err, result) {
if (err) throw err;
return result;
});
console.log(data); // undefined should be value :(
return data;
});
如果有人能帮助我并指导我更多地解释这些函数的哪些部分是异步的,哪些值是等待的,我将非常感激。另外,如果您不介意将其作为一个有决心的承诺来写,这可能会帮助我了解更多。您可以使用以下内容:
const mongoose = require('mongoose')
// connectionString is the link to your database
mongoose.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true})
const db = mongoose.connection
db.on('error', () => console.log("Couldn't connect to DB"))
db.once('open', () => {
console.log('Connected to mongoDB!')
// Add your code in here
)}
Mongo方法大多会返回承诺,并且(据我所知)继续进行回调以保持旧应用程序正常工作,但这两种方法不会混合使用,承诺是开发新代码的方式 在使用promises时,有一个旧的(then/catch)和新的(async/await)语法选择,没有理由混合使用。我认为学习旧式的承诺更好,所以
function getPractitioners(id) {
const dbo = client.db(prod == 1 ? "prodData" : "test");
return dbo.collection("practitioners").findOne({"_id" : id}) // returns a promise
}
getPractitioners("Oq1tOesempf3jjLfrVrWaVtaROI3").then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});
在较新的语法中(我仍然建议先学习旧的方法)
有没有一种没有猫鼬的方法?我对学习目的更感兴趣如果你想使用承诺(使用
async
/wait
),请不要通过回调。谢谢,这就是我要找的。我以两种方式实现了它。我还在试图把所有的.然后()和承诺之类的东西都包起来!
async function getPractitioners(id) {
const dbo = client.db(prod == 1 ? "prodData" : "test");
return dbo.collection("practitioners").findOne({"_id" : id}) // still returns a promise, but can be await-ed
}
try {
let result = await getPractitioners("Oq1tOesempf3jjLfrVrWaVtaROI3");
console.log(result);
} catch (err) {
console.log(err)
}