我有一些代码可以从集合中提取所有文档并将其放到网页上。简化版本如下所示:
var mongodb = require("mongodb"),
express = require("express"),
mongoServer = new mongodb.Server('localhost', 27017),
dbConnector = new mongodb.Db('systemMonitor', mongoServer),
db;
var app = new express();
app.get('/drives', function(req, res) {
db.collection('driveInfo', function(err, collection) {
if (err) throw err;
collection.find({}, function(err, documents) {
res.send(documents);
});
});
});
dbConnector.open(function(err, opendb) {
if (err) throw err;
db = opendb;
app.listen(80);
});
我有一个包含很长文档列表的driveInfo集合。每个文档都包含嵌套对象。我想做的是,每当有人在他们的浏览器中访问/驱动时,将整个集合打印为json对象,以便我可以稍后使用jquery抓取所有内容(api的开头)
但是,我收到错误提示“TypeError:将循环结构转换为JSON”。页面上的错误指向这行代码:
collection.find({}, function(err, documents) {
res.send(documents);
});
我不确定问题是什么,或者自我引用的位置。我不是在正确地查询收藏品吗?
答案 0 :(得分:16)
不确定您使用的是哪个版本的API,但我认为您的语法可能在查看API规范时出错:
http://docs.mongodb.org/manual/reference/method/db.collection.find/
这是宣言:
db.collection.find(<criteria>, <projection>)
你绝对会误用投影参数。像你一样传递一个回调似乎在结果中返回 db 对象,这导致在快速JSON序列化期间出现循环错误。
查找所有操作的正确代码应该是:
collection.find({}).toArray(function(error, documents) {
if (err) throw error;
res.send(documents);
});
答案 1 :(得分:0)
在我的情况下,我收到错误是因为我正在查询(使用 mongoose find 方法)而没有执行等待。请看下面
给出错误的查询(因为我没有使用 await 执行这个查询):
const tours = Tour.find({
startLocation: {
$geoWithin: { $centerSphere: [[longitude, latitude], radius] }
}
});
我在邮递员上遇到的错误:
"message": "Converting circular structure to JSON\n --> starting at object with constructor 'NativeTopology'\n | property 's' -> object with constructor 'Object'\n | property 'sessionPool' -> object with constructor 'ServerSessionPool'\n --- property 'topology' closes the circle"
我是如何摆脱上述错误的(添加了await):
const tours = await Tour.find({
startLocation: {
$geoWithin: { $centerSphere: [[longitude, latitude], radius] }
}
});
答案 2 :(得分:0)
回调选项来自 Mongoose 而不是来自 MongoDB see docs。
// Mongoose Docs : callback option
MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {});
// Example
app.get( '/api/users' , (req,res,done)=>{
let getUsers = NewUser.find({},(err,data)=>{
if(err) return done(err);
res.json(data)
});
});
看看响应是回调,在你的情况下是
YourModel.find({}, function(err, documents) {
if(err) return done(err);
res.send(documents); // <-- here
});
// <-- not here
在 Mongo 中有一个 cursor 方法 来访问文档 next()
see docs :
var myCursor = db.bios.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}
您可以在 manual/crud 的 mongo 文档中找到 CRUD 操作。在 Query Documents 中,您将看到 db.inventory.find( {} )
:要选择集合中的所有文档,请将一个空文档作为查询过滤器参数传递给 find 方法。
Async/Await 函数解决方案:Mongo Docs
app.get( '/api/users' , async (req,res)=>{
const getUsers = await NewUser.find({});
res.json( getUsers );
})
<回调>解决方案:Mongoose Docs。
app.get( '/api/users' , (req,res,done)=>{
let getUsers = NewUser.find({},(err,data)=>{
if(err) return done(err);
res.json(data)
});
});