首页 > 解决方案 > 如何修复 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应该在undefined之前打印出来。这是一个可能的问题吗?

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())

标签: node.jsmongodb

解决方案


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())

在所有异步调用中添加了 try catch 和 async await


推荐阅读