求救关于通过_id查询文章的问题 Nodejs
求救关于通过_id查询文章的问题 Nodejs
Post.getOne = function(post._id, allback) { //打开数据库 mongodb.open(post._id,function (err, db) { if (err) { return callback(err); } //读取 posts 集合 db.collection(‘posts’, function (err, collection) { if (err) { mongodb.close(); return callback(err); } //根据用户名、发表日期及文章名进行查询 //collection.findOne({ // “name”: name, // “time.day”: day, // “title”: title collection.findOne({ “_id”: require(‘mongodb’).ObjectID(post._id) }, function (err, doc) { mongodb.close(); if (err) { return callback(err); } //解析 markdown 为 html if(doc){ doc.post = markdown.toHTML(doc.post); doc.comments.forEach(function (comment) { comment.content = markdown.toHTML(comment.content); }); } callback(null, doc);//返回查询的一篇文章 }); }); }); };这种方式错在什么地方,求救大神
问题分析
你当前的代码有几个问题需要修正:
- 回调函数拼写错误:
allback
应该是callback
。 - 字符串引号不一致:
<a href="//collection.findOne">//collection.findOne</a>
这部分是多余的,而且字符串引号应该保持一致,使用单引号或双引号。 - 变量名错误:
allback
应该是callback
。 require('mongodb')
的使用:你应该确保你已经安装了mongodb
模块,并且正确引用它。
示例代码
下面是修正后的代码示例:
const mongodb = require('mongodb');
Post.getOne = function(postId, callback) {
// 打开数据库连接
mongodb.MongoClient.connect('mongodb://localhost:27017/your_database_name', { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
if (err) {
return callback(err);
}
const db = client.db('your_database_name');
// 读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
client.close();
return callback(err);
}
// 根据 _id 查询文档
collection.findOne({
"_id": new mongodb.ObjectID(postId)
}, function (err, doc) {
client.close();
if (err) {
return callback(err);
}
// 解析 markdown 为 HTML
if (doc) {
doc.post = markdown.toHTML(doc.post);
doc.comments.forEach(function (comment) {
comment.content = markdown.toHTML(comment.content);
});
}
callback(null, doc); // 返回查询的一篇文章
});
});
});
};
解释
- 数据库连接:使用
mongodb.MongoClient.connect
方法来连接到 MongoDB 数据库。这里需要提供正确的数据库 URL 和选项。 - 读取集合:通过
db.collection('posts')
获取posts
集合。 - 查询文档:使用
collection.findOne
方法根据_id
查询文档。注意,_id
需要转换为mongodb.ObjectID
类型。 - 处理结果:如果查询成功,解析 Markdown 并调用
callback
返回结果。
这样修改后,你的代码应该能够正常工作。
那个callback是粘贴时候不小心删掉了c,不是错误
为甚么获取_id总是显示undefined,是没办法获取么,求教
你提供的代码中有几个问题需要修正:
allback
应该是callback
。- 在使用 MongoDB 的
ObjectID
时,应该从mongodb
模块中正确导入。 db.collection
的第二个参数应该是回调函数。mongodb.close()
应该在所有操作完成之后再关闭数据库连接。
以下是修正后的代码示例:
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
Post.getOne = function(id, callback) {
// 连接到 MongoDB 数据库
MongoClient.connect('mongodb://localhost:27017/your_database_name', { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
if (err) {
return callback(err);
}
const db = client.db('your_database_name');
const collection = db.collection('posts');
// 使用正确的 ObjectID 构造函数
const objectId = mongodb.ObjectId(id);
// 查询指定的文章
collection.findOne({ "_id": objectId }, function (err, doc) {
if (err) {
client.close();
return callback(err);
}
if (doc) {
// 解析 Markdown 为 HTML
doc.post = markdown.toHTML(doc.post);
doc.comments.forEach(function (comment) {
comment.content = markdown.toHTML(comment.content);
});
}
// 返回查询结果
callback(null, doc);
client.close(); // 关闭数据库连接
});
});
};
解释:
- MongoClient.connect: 这是连接到 MongoDB 的推荐方式。确保使用了最新的 URL 解析器选项(如
useNewUrlParser
和useUnifiedTopology
)。 - mongodb.ObjectId: 正确地创建一个 ObjectId 对象来匹配
_id
字段。 - client.close(): 确保只有在所有操作完成后才关闭数据库连接。
这段代码应该可以解决你的问题,并正确地查询指定的文章。