当前位置: 首页 > 知识库问答 >
问题:

节点。js Mongodb系列。可数文件回调不起作用

皇甫喜
2023-03-14

我正在尝试编写一个节点。使用MongoDB节点获取特定MongoDB集合中最近添加的项的js应用程序。js驱动程序3.4。据我所知,这样做的方法是使用collection。countDocuments要将文档数传递给回调函数,请创建一个跳过该数字-1的光标,然后调用函数实际返回文档。我的问题是回调到集合。这些文档似乎从未真正运行过。

我的代码,包括console.log调试调用:

    mongo.connect(dburl, (err, client) => {
        console.log("Attempting to connect to database");
        if(err) {
            console.log("Couldn't connect to server");
            throw err;
        }
        else {
            var heatdata;
            try {
                var db = client.db(dbname);
                console.log("Database: " + db.databaseName);
                var dbo = db.collection(colName);
                console.log("Collection: " + dbo.collectionName);
                dbo.countDocuments({}, function(err,count) {
                    console.log("Count");
                    if (err) throw err;
                    dbo.find({}).skip(count - 1).toArray((err, docs) => {
                        console.log("Made it to skip");
                        if (err) {
                            res.writeHead(500, {'Content-Type': 'text/html'});
                            res.write('<h1>Error on accessing database information.</h1>');
                            console.log("Couldn't get the requested document");
                            res.end();
                            throw err;
                        }
                        else {
                            console.log("Result: " + docs);
                            heatdata = docs;
                            console.log("In method: " + heatdata);
                        }
                    });
                    console.log("Past the find");
                });
                console.log("Past the count");
            }
            catch(e) {
                console.log("Error caught: " + e.name);
                throw e.message;
            }
            console.log("Out of method: " + heatdata);
            res.writeHead(200, {'Content-Type': 'application/json'});
            res.write(heatdata);
            res.end();
        }
    });

预期控制台输出:

Attempting to connect to database
Database: myDatabase
Collection: myCollection
Count
Made it to skip
Result: {foo:bar}
In method: {foo:bar}
Past the find
Past the count
Out of method: {foo:bar}

实际产量:

Attempting to connect to database
Database: myDatabase
Collection: myCollection
Past the count
Out of method: undefined
TypeError: First argument must be string or Buffer

换句话说,dbo.count文档中的任何代码都没有运行,包括第一个日志语句,它甚至在第一时间输入了回调。这可能是怎么回事?

提前感谢。

编辑:回溯如下:

TypeError: First argument must be a string or Buffer
at write_ (_http_outgoing.js:642:11)
at ServerResponse.write (_http_outgoing.js:617:10)
at mongo.connect (C:\Netshare\heatgraph.js:72:21)
at result (C:\Netshare\node_modules\mongodb\lib\utils.js:414:17)
at executeCallback (C:\Netshare\node_modules\mongodb\lib\utils.js:406:9)
at err (C:\Netshare\node_modules\mongodb\lib\operations\mongo_client_ops.js:286:5)
at connectCallback (C:\Netshare\node_modules\mongodb\lib\operations\mongo_client_ops.js:241:5)
at process.nextTick (C:\Netshare\node_modules\mongodb\lib\operations\mongo_client_ops.js:463:7)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickCallback (internal/process/next_tick.js:181:9)

注意,当我注释掉countDocuments块并用dbo替换它时。查找()。限制(1)。排序({$natural:-1})。下一步(回调) ,我得到了完全相同的回溯。

编辑2:所以当我运行在超文本传输协议侦听器之外截取的原始代码时,它提供了这个控制台输出:

Attempting to connect to database
Connection: true
Database: faketemps
Collection: temps
Past the count
Out of array method: undefined
Connection: true
Count
Past the find
Made it to skip
Result: [object Object]
In array method: [object Object]

所以基本上,回调似乎没有运行的原因是我没有给它足够的时间来实际运行。我将尝试用setInterval来包装这一切,让它尝试几次实际获取一些东西,然后在适当的时间点超时。不管怎样,这是异步编程的正式经验。


共有1个答案

缑智敏
2023-03-14

countDocuments函数的使用方式如下:

dbo.countDocuments(requestObj, options, callback)

第二个参数是option参数(参见https://docs.mongodb.com/manual/reference/method/db.collection.countDocuments/更多细节)。

希望这会有所帮助。

 类似资料:
  • 我使用ubuntu 14.04,当我在终端上使用节点hello.js命令时,什么都不会发生。我使用sudo apt-get命令安装了这些包。我不知道出了什么问题。没有错误消息或任何东西。我寻找我的问题,但什么也没找到。

  • 我的源XML文档 根据元素内容的模式,在元素中的元素中,我希望添加一个新的元素。元素是前导信息。因此,首先,我必须创建一个新的元素及其和内容。之后,我必须创建一个相应的元素,该元素具有相同的内容和特定的内容。 这是我的目标XML文档的示例(添加param03): 我的XSLT文档 结果XML文档错误 我遇到的问题: > 使用不会按预期更改节点上下文。新的元素将在最后一个位置添加到元素中,而不是按照

  • 我得到了这样的错误{“code”:“er_parse_error”,“errno”:1064,“sqlmessage”:“您的SQL语法中有错误;请查看与您的MySQL服务器版本相对应的手册,以便在第1行'sp_li_uploaddata_get'附近使用正确的语法”,“sqlstate”:“42000”,“index”:0,“SQL”:“sp_li_uploaddata_get”}

  • 问题内容: 我正在使用ColdFusion从数据库中提取数据到dataTable中,我希望当我单击datatable中的一行并触发事件时,该行的详细信息可以在同一页面上的div中显示。 下面是我正在使用的代码,但它无法正常工作,如果有人可以给我一个有效的示例,我将不胜感激 我收到以下错误消息: 错误-无法读取未定义的属性’_aData’ 问题答案: 在重新分配按钮之前,请尝试取消绑定该按钮的事件:

  • 我试图用pyinstaller创建python脚本的可执行文件,但它不起作用。 如果我从终端运行exe文件,我得到这些错误: 我在项目的虚拟环境中使用pip安装了pyInster。 我将感谢任何帮助。 先谢谢你。

  • 我试图使用cypher创建一个查询,该查询将“查找”厨师可能有的缺失食材,我的图是这样设置的: