求救关于通过_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);//返回查询的一篇文章 }); }); }); };这种方式错在什么地方,求救大神


4 回复

问题分析

你当前的代码有几个问题需要修正:

  1. 回调函数拼写错误allback 应该是 callback
  2. 字符串引号不一致<a href="//collection.findOne">//collection.findOne</a> 这部分是多余的,而且字符串引号应该保持一致,使用单引号或双引号。
  3. 变量名错误allback 应该是 callback
  4. 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); // 返回查询的一篇文章
            });
        });
    });
};

解释

  1. 数据库连接:使用 mongodb.MongoClient.connect 方法来连接到 MongoDB 数据库。这里需要提供正确的数据库 URL 和选项。
  2. 读取集合:通过 db.collection('posts') 获取 posts 集合。
  3. 查询文档:使用 collection.findOne 方法根据 _id 查询文档。注意,_id 需要转换为 mongodb.ObjectID 类型。
  4. 处理结果:如果查询成功,解析 Markdown 并调用 callback 返回结果。

这样修改后,你的代码应该能够正常工作。


那个callback是粘贴时候不小心删掉了c,不是错误

为甚么获取_id总是显示undefined,是没办法获取么,求教

你提供的代码中有几个问题需要修正:

  1. allback 应该是 callback
  2. 在使用 MongoDB 的 ObjectID 时,应该从 mongodb 模块中正确导入。
  3. db.collection 的第二个参数应该是回调函数。
  4. 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 解析器选项(如 useNewUrlParseruseUnifiedTopology)。
  • mongodb.ObjectId: 正确地创建一个 ObjectId 对象来匹配 _id 字段。
  • client.close(): 确保只有在所有操作完成后才关闭数据库连接。

这段代码应该可以解决你的问题,并正确地查询指定的文章。

回到顶部