如何修复node.js和mongoDB无法返回信息

时间:2019-04-25 21:43:05

标签: node.js mongodb

我正在node.js中设置一个服务,该服务将跟踪网站上的URL点击。我在查看mongoDB中的数据时遇到问题。我可以拉出文件。

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

然后,我解析该字符串,最后得到0,即计数,如预期的那样。但是,当我返回此计数然后将其记录时,我得到了undefined error

我试图调试代码,偶然发现了一件可能重要的事情。

node.js控制台打印出URL输入,然后打印出undefined,如果我没有记录函数的结果,则不记录该记录,然后然后打印出Retrieved From DB: 0。如果我看我的代码,Retrieved From DB: 0应该在未定义的之前打印出来。这可能是个问题吗?

var MongoClient = require('mongodb').MongoClient;
var mongourl = "mongodb://localhost:27017/";


function count() {
    let string = "reapnow.ml+test"
    lengths = string.split("+")
    console.log(lengths)
    fullurl = (lengths[0] + "?ref_source=" + lengths[1])
    MongoClient.connect(mongourl, function (err, db) {
        var dbo = db.db("analytics")
        var query = {url: fullurl}
        dbo.collection("main").find(query).toArray(function (err, result) {
            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('}]'))
            console.log("Retrieved From DB: " + res)
            //At this point, res is 0
            db.close()
            return (count)
        })
    })
}
console.log(count()) //ouputs the word undefined.

我的预期输出为0,而不是未定义。

修改1: 使用awat / async尝试过,我做错了吗?或者这不是正确的做法?

var MongoClient = require('mongodb').MongoClient;
var mongourl = "mongodb://localhost:27017/";

async function count() {
    let string = "reapnow.ml+test"
    lengths = string.split("+")
    console.log(lengths)
    fullurl = (lengths[0] + "?ref_source=" + lengths[1])
    try{
    var db = await MongoClient.connect(mongourl)
        var dbo = db.db("analytics")
        var query = {url: fullurl}
         var result = await dbo.collection("main").find(query).toArray()
            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('}]'))
            console.log("Retrieved From DB: " + res)
            //At this point, res is 0
            db.close()
            return res
}
catch(error)
{
    return error
}


}
console.log(await count())

1 个答案:

答案 0 :(得分:-1)

var MongoClient = require('mongodb').MongoClient;
var mongourl = "mongodb://localhost:27017/";

async function count() {
    let string = "reapnow.ml+test"
    lengths = string.split("+")
    console.log(lengths)
    fullurl = (lengths[0] + "?ref_source=" + lengths[1])
    try{
	var db = await MongoClient.connect(mongourl)
        var dbo = db.db("analytics")
        var query = {url: fullurl}
         var result = await dbo.collection("main").find(query).toArray()
            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('}]'))
            console.log("Retrieved From DB: " + res)
            //At this point, res is 0
            db.close()
            return count
}
catch(error)
{
	return error
}
        
    
}
console.log(await count())

在所有异步调用中添加了尝试捕获和异步等待