我刚开始使用hapi.js(^ 17.3.1)和mongodb(^ 3.0.7),以及异步js代码。
在路由处理程序中,我正在尝试从数据库中检索数据。作为测试,我将一个字符串存储在通过循环数据库集合记录构建的变量“s”中。浏览器的预期输出是
启动dbInfo1 dbInfo2 dbInfoN end
我已尝试过此代码的各种版本:
module.exports = {
method: 'GET',
handler: async function (request, reply) {
return await getRoutes();
}
}
async function getRoutes() {
var s = "start";
const mongo = require('mongodb').MongoClient;
const mongoUrl = "mongodb://127.0.0.1:27017/";
return // I'm returning this whole thing because hapi.js says it wants a promise. (500 error)
await mongo.connect(mongoUrl)
.then(function(client) {
client.db("dbName").collection("collectionName")
.find({})
.forEach(function (record) {
console.log(record.item);
s += " | " + record.item;
});
s + " end"; // But I've tried placing "return" here (500 error)
});
// I've also tried ".then(function(s) { return s + 'end' }) here but it seems to only have the same set of options/problems manifest.
// I've also made it so that I place "return s + 'end'" here (displays "start end" with nothing in the middle).
}
我尝试将return语句放在不同的地方。我在控制台中遇到http 500错误
调试:内部,实现,错误
错误:处理程序方法未返回值,承诺或抛出错误
dbInfo1
dbInfo2
dbInfoN
如果我自己或承诺内部返还承诺,或者我得到
如果我从承诺外面返回,则在浏览器中开始结束
。
在任何一种情况下,console.log语句都会打印出dbInfos输出。
我尝试了异步的不同位置,包含和遗漏,等待几乎相同的结果。我还尝试使用“new Promise(...”)将getRoutes中返回的内容包装到显式Promise中。在这种情况下,控制台会记录dbInfos,但浏览器会挂起。
如何在返回变量s之前等待“foreach”函数?
答案 0 :(得分:1)
没有测试,我可以说这是错误的:
return // I'm returning this whole thing because hapi.js says it wants a promise. (500 error)
await mongo.connect(mongoUrl)
.then(function(client) {
client.db("dbName").collection("collectionName")
.find({})
.forEach(function (record) {
console.log(record.item);
s += " | " + record.item;
});
s + " end"; // But I've tried placing "return" here (500 error)
});
return被解析为return;
return await mongo.connect(mongoUrl)
.then(function(client) {
client.db("dbName").collection("collectionName")
.find({})
.forEach(function (record) {
console.log(record.item);
s += " | " + record.item;
});
s + " end"; // But I've tried placing "return" here (500 error)
});
是正确的方法。任何短信都会警告你。
答案 1 :(得分:0)
最后!得到它使用此代码:
module.exports = {
method: 'GET',
handler: function (request, reply) {
return getRoutes();
}
}
function getRoutes() {
const mongo = require('mongodb').MongoClient;
const mongoUrl = "mongodb://127.0.0.1:27017/";
return mongo.connect(mongoUrl)
.then(async function(client) {
var s = "start";
var documents = await
client.db("dbName").collection("collectionName")
.find()
.toArray();
for (const doc of documents)
s += " | " + await doc.item;
return s + " end";
});
}
问题是我认为,因为" getRoutes"被标记为"异步",里面的东西"。然后"同样是异步的。但我真的需要标记"功能(客户端)" as" async"。我还需要停止使用" forEach"并对集合使用更传统的迭代。
我实际上标记了"功能(客户端)" as" async"以前,但是它是出于盲目的试验和错误,因此我从未使用过#34; await"正常。在我阅读Anton Lavrenov的this博客之前,我并没有真正理解它。
虽然我最近才问过这个问题,但我在此之前已经做了很长时间了。真的很高兴我现在所处的位置。当然,感谢@desoares指出我在上面使用的代码版本中的愚蠢错误。