如何在使用与mongoDB的异步时修复node.js返回{}

问题描述 投票:0回答:2

我正在尝试让node.js在调用时从mongoDB数据库返回信息。在我的数据库中,我有

_id: ObjectID("5cc0fe18f7875c00bc88de4c")
url:"google.com?ref_source=test"
count:0

基本上,当我做http://localhost:8080/count/google.com+test时,我希望我的代码进入MongoDB并检索count前面的值。当我运行此代码时,结果,1正在记录但未返回。相反,{}正在返回。

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.text())
var MongoClient = require('mongodb').MongoClient;
var mongourl = "mongodb://localhost:27017/";

async function getcount(fullurl) {


    try{
        var db = await MongoClient.connect(mongourl) //Connect to mongoDB
        var dbo = db.db("analytics")  //Connect to analytics DB
        var query = {url: fullurl}  //Find results with the input under URL
        var result = await dbo.collection("main").find(query).toArray()  //Connect to main collection
        let res = JSON.stringify(result)
        res = res.substring(res.indexOf(":") + 1)
        res = res.substring(res.indexOf(":") + 1)
        res = res.substring(res.indexOf(",") + 1)
        res = res.substring(res.indexOf('":') + 2)
        res = res.substring(0, res.indexOf('}]'))
        // Get result
        db.close()
        return await res  //Return it
    }
    catch(error)
    {
        return error
    }


}

function isURL(str){
    var pattern = new RegExp('^((ft|htt)ps?:\\/\\/)?'+ // protocol
        '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name and extension
        '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
        '(\\:\\d+)?'+ // port
        '(\\/[-a-z\\d%@_.~+&:]*)*'+ // path
        '(\\?[;&a-z\\d%@_.,~+&:=-]*)?'+ // query string
        '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
    return pattern.test(str);
}



async function count(string){
    try {
        //console.log(string)
        string = string.split("(!").join("/");
        //console.log(string)
        string = string.split("/?ref_source=").join("+");
        //console.log(string)
        string = string.split("https://").join("");
        //console.log(string)
        lengths = string.split("+")
        toReturn = ("Not a Valid Url Input: " + lengths[0])
        if (isURL(lengths[0])) {
            if ((lengths[1] == "") || (lengths[1] == "undefined")) {
                return "Not A Valid Identifier Input"
            }
            fullurl = (lengths[0] + "?ref_source=" + lengths[1])
            console.log(fullurl)
            let response = await(getcount(fullurl))
            console.log(response)  //Log the info
            return await (response) //Return it.  THIS is THE PART THAT FAILS
        }
    }
    catch(error)
    {
        return error
    }

}


app.get('/count/:string', (req, res) => {
    res.send((count(req.params.string)))
})
app.listen(8080, () => console.log('> Listening!'))
node.js mongodb asynchronous
2个回答
0
投票

由于count是异步函数,你必须在使用res.send()发送它们之前等待结果,这样的事情(注意我在函数之前添加了异步)。

app.get('/count/:string', async (req, res) => {
    let result = await count(req.params.string)
    res.send(result)
})

或者你必须使用诺言

app.get('/count/:string', (req, res) => {
    count(req.params.string).then(result =>{
       res.send(result)
    })
})

0
投票

当你“返回await res”时,你告诉Node你正在返回一个Promise。你应该只使用“return res”(在getcount中)和“return response”(在你的count函数中),因为这些都是已定义的变量,而不是实际的异步函数。

© www.soinside.com 2019 - 2024. All rights reserved.