Как исправить возвращение файла node.js {} при использовании async с mongoDB - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь заставить 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!'))

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Поскольку 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 голосов
/ 29 апреля 2019

Когда вы «возвращаете и ждете разрешения», вы сообщаете Node, что вы возвращаете Обещание.Вы должны просто использовать «return res» (в getcount) и «return response» (в вашей функции count), так как это обе переменные, которые уже определены, а не асинхронные функции.

...