Nodejs mongodb数据查询的问题。

Nodejs mongodb数据查询的问题。

function getListRespond(req, res, next) { mongodb.connect(‘mongodb://127.0.0.1:27017/plant’, function(err, db) { if(err) throw err; var collection = db.collection(‘Flower’); var cursor = collection.find({ “FlowerCode” : 1 }); cursor.toArray(function(err, docs) { if(err){ console.error(err.message); }else{ res.send(docs); db.close(); } }); }); } 本人刚学习没多久,请教个问题,plant是数据库,Flower是表,查询FlowerCode=1的数据 ,在用var server = restify.createServer(); server.get(’/blog’,getListRespond); rest返回数据,为啥感觉好像是数据库没查到内容的感觉,这是哪里错了么?


2 回复

根据你的描述,你在使用 Node.js 和 MongoDB 进行数据查询时遇到了一些问题。你想要查询 Flower 集合中 FlowerCode 等于 1 的文档,并通过 REST API 返回这些文档。然而,你感觉查询结果为空。

以下是一个修正后的代码示例,以及对可能问题的解释:

示例代码

const mongoose = require('mongoose'); // 引入 Mongoose 库
const restify = require('restify'); // 引入 Restify 库

// 连接到 MongoDB 数据库
mongoose.connect('mongodb://127.0.0.1:27017/plant', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义一个简单的 schema
const flowerSchema = new mongoose.Schema({
    FlowerCode: Number,
    // 其他字段...
});

// 创建模型
const Flower = mongoose.model('Flower', flowerSchema);

// 创建服务器
const server = restify.createServer();

// 定义路由处理函数
async function getListRespond(req, res, next) {
    try {
        const flowers = await Flower.find({ FlowerCode: 1 }).exec(); // 使用 async/await 来简化异步操作
        res.send(flowers);
    } catch (err) {
        console.error(err.message);
        res.status(500).send({ error: 'An error occurred while fetching data.' });
    }
}

// 设置路由
server.get('/blog', getListRespond);

// 启动服务器
server.listen(8080, () => {
    console.log('%s listening at %s', server.name, server.url);
});

可能的问题及解决方法

  1. 连接字符串:

    • 确保你的 MongoDB 实例正在运行,并且连接字符串正确无误。
  2. 错误处理:

    • 使用 try...catch 块来捕获并处理可能发生的错误,这有助于调试。
  3. 使用 async/await:

    • 使用 async/await 语法可以使代码更简洁易读,并且可以更好地处理异步操作。
  4. Mongoose 模型:

    • 使用 Mongoose 模型来定义集合结构,并利用其内置的方法(如 .find())进行查询,这样可以避免一些低级错误。
  5. 检查数据:

    • 确保 Flower 集合中有 FlowerCode 等于 1 的文档。你可以先手动插入一些测试数据,然后尝试查询。

通过以上修改,你应该能够更好地处理查询逻辑,并确保在查询失败时能够得到适当的错误信息。


根据你的描述,你的代码逻辑看起来基本正确,但有几个地方可以检查或优化:

  1. 连接字符串中的引号:确保你在连接字符串中使用的是标准的双引号(")或单引号(’),而不是其他类型的引号。

  2. 错误处理:你需要确保错误被正确地捕获并处理。例如,在 cursor.toArray 中捕获错误后,你可以打印错误信息以帮助调试。

  3. 检查数据是否存在:如果查询结果为空,docs 将是一个空数组。你可以添加一些逻辑来处理这种情况。

  4. 异步操作:确保所有的回调函数都被正确调用,并且没有遗漏任何错误处理。

以下是修改后的代码示例:

const mongodb = require('mongodb');
const restify = require('restify');

function getListRespond(req, res, next) {
    mongodb.connect('mongodb://127.0.0.1:27017/plant', function(err, db) {
        if (err) {
            console.error('数据库连接失败:', err.message);
            return res.send(500, { error: 'Database connection failed' });
        }
        
        const collection = db.collection('Flower');
        const cursor = collection.find({ "FlowerCode": 1 });

        cursor.toArray(function(err, docs) {
            if (err) {
                console.error('查询失败:', err.message);
                return res.send(500, { error: 'Query failed' });
            }

            // 如果没有找到数据,返回一个空数组
            if (docs.length === 0) {
                res.send(200, []);
            } else {
                res.send(docs);
            }

            db.close();
        });
    });
}

const server = restify.createServer();
server.get('/blog', getListRespond);

server.listen(3000, () => {
    console.log('Server is listening on port 3000');
});

解释:

  • 错误处理:在每个可能出错的地方都加上了错误处理逻辑。
  • 响应处理:如果查询结果为空,则返回一个空数组;如果不为空,则返回查询结果。
  • 服务器监听:确保服务器监听一个端口以便测试。

通过这些改进,你应该能够更好地调试和理解为什么查询结果为空,以及如何处理这种情况。

回到顶部