如何将mongodb信息返回到hapi.js路由处理程序中的浏览器?

时间:2018-05-05 14:39:17

标签: javascript mongodb asynchronous es6-promise hapijs

我刚开始使用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”函数?

2 个答案:

答案 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指出我在上面使用的代码版本中的愚蠢错误。