我想做的是允许指定 sort_order 或留空。 当它被指定时,它就会被使用。 如果未指定,则会在数据库中查询最大数字,该数字会递增并使用。 我的问题是数据库调用是异步的并且位于“if”语句内。
在将新数据插入数据库之前确保“sort_order”不是未定义的最佳实践是什么?
代码片段如下所示:
if (sort_order == undefined) {
MongoClient.connect(dbUrl, function (err, db) {
var dbo = db.db("HIDDEN");
dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 } }, function (err, data) {
sort_order = data.sort_order + 1;
});
});
}
console.log(sort_order);
提前致谢,
詹姆斯
编辑(08/06/2018):我认为这个问题与建议的另一个问题不同,因为存在 sort_order 不是未定义并且可以预先指定的情况。使用其他问题的答案,可能必须写入重复内容(在 if 语句内的回调内以及 if 语句之后)
最佳答案
您应该从回调转向 Promises 或 Async/Await,后者更容易阅读:
async function retrieveValue(sort_order) {
if (sort_order === undefined) {
const db = await MongoClient.connect(dbUrl);
const dbo = db.db("HIDDEN");
const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
return data.sort_order + 1;
};
return sort_order;
}
编辑(使用 try-catch block ):
async function retrieveValue(sort_order) {
try {
if (sort_order === undefined) {
const db = await MongoClient.connect(dbUrl);
const dbo = db.db("HIDDEN");
const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
return data.sort_order + 1;
}
} catch (error) {
console.log(error);
}
return sort_order;
}
基本上,您在定义函数时将其标记为 async
,并且每当您期望 Promise
时,您就用 await
标记它,这样它“等待”您的数据。
关于Node.JS 等待变量被设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50751048/