Nodejs mongoose 实现查询功能 修改成函数

Nodejs mongoose 实现查询功能 修改成函数

var mongoose = require(‘mongoose’) ;	
var models = require(’…/models/username’) ;
var User = models.User ;
mongoose.connect(‘mongodb://localhost/mongogroup’) ;
function doquery(){
User.find({“username”:“xiaoming”},function(err,doc){
if(doc) {	
console.log(‘found it’);
};
});
}

username.js 中的内容为

var mongoose = require('mongoose') ;	
var Schema = mongoose.Schema ;	
var UserSchema = new Schema({
	username : String ,
}) ;
exports.User = mongoose.model('User',UserSchema) ;

数据库连接没有什么问题,为什么不能实现查询功能了?

ps:事实上去掉function doquery(){ }是可以工作的,为什么加上后运行就是没有任何反应!


6 回复

要将 doquery 函数修改并确保其能够正确执行查询功能,我们需要确保几个关键点:

  1. 确保在调用 doquery 函数之前,Mongoose 已经成功连接到 MongoDB。
  2. 使用 async/await 来处理异步操作,这样可以更好地控制代码流程。
  3. 检查查询结果是否为空,并且正确处理错误。

下面是改进后的代码示例:

改进后的 doquery 函数

const mongoose = require('mongoose');
const models = require('../models/username');
const User = models.User;

// 连接数据库
mongoose.connect('mongodb://localhost/mongogroup', {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(() => {
    console.log("Connected to MongoDB");
});

// 定义 doquery 函数
async function doquery() {
    try {
        const doc = await User.find({ "username": "xiaoming" });
        if (doc.length > 0) {
            console.log('Found it:', doc);
        } else {
            console.log('No user found with the username xiaoming');
        }
    } catch (err) {
        console.error('Error occurred during query:', err);
    }
}

// 调用 doquery 函数
doquery();

解释

  1. 数据库连接

    • 使用 mongoose.connect 方法连接到 MongoDB。这里使用了最新的选项 useNewUrlParseruseUnifiedTopology 来避免警告信息。
    • 在连接成功后,输出一条确认信息。
  2. 定义 doquery 函数

    • 使用 async 关键字来定义 doquery 函数,以便我们可以使用 await 处理异步操作。
    • 使用 try...catch 块来捕获可能发生的错误。
    • 使用 await 等待 User.find 查询完成,并检查返回的文档数组长度是否大于 0。
    • 如果找到文档,打印出找到的文档;如果没有找到,则输出相应的提示信息。
  3. 调用 doquery 函数

    • 在脚本末尾直接调用 doquery() 函数,以执行查询操作。

通过这种方式,你可以确保查询功能能够正确执行,并且错误会被妥善处理。


搭车做个广告,操作mongoose必须少不了mongoomise

function doquery(){ User.find({“username”:“xiaoming”},function(err,doc){ if(doc) { console.log(‘found it’); }) ; } 少了个大括号吧

function doquery(){ User.find({“username”:“xiaoming”},function(err,doc){ if(doc) { console.log(‘found it’); } }) ; }

求解决!自己顶!

在你的代码中,doquery 函数被定义但没有被调用。因此,该函数不会被执行。你需要调用 doquery 函数以执行查询操作。

此外,为了提高代码的可读性和可维护性,可以将查询逻辑封装到一个独立的函数中,并提供一些参数来控制查询条件。下面是一个修改后的版本:

username.js 文件

保持不变:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({
    username: String,
});

module.exports = mongoose.model('User', UserSchema);

main.js 或其他入口文件

添加对 doquery 函数的调用,并改进查询逻辑:

var mongoose = require('mongoose');
var User = require('./models/username');

mongoose.connect('mongodb://localhost/mongogroup', {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(() => {
    console.log("Connected to MongoDB");
}).catch((error) => {
    console.error("Failed to connect to MongoDB", error);
});

// 定义一个查询函数
function doQuery(query, callback) {
    User.find(query, function (err, doc) {
        if (err) {
            console.error('Error querying database:', err);
            return;
        }
        if (doc.length > 0) {
            console.log('Found it:', doc);
            callback(null, doc); // 如果需要返回结果给调用者
        } else {
            console.log('No results found.');
            callback(null, null); // 如果需要返回结果给调用者
        }
    });
}

// 调用 doQuery 函数进行查询
doQuery({ username: 'xiaoming' }, function (err, result) {
    if (err) {
        console.error('An error occurred:', err);
    } else {
        console.log('Result:', result);
    }
});

解释

  1. mongoose.connect 现在使用了两个选项 useNewUrlParseruseUnifiedTopology 来确保正确的连接配置。
  2. doQuery 函数 接受一个查询对象作为参数,并返回查询结果。
  3. 回调函数 在查询完成后被调用,以处理查询结果或错误。
  4. doQuery 函数 被调用时传入查询条件 { username: 'xiaoming' } 和一个回调函数来处理查询结果。

这样你可以更灵活地复用查询逻辑,并且更容易扩展其他查询条件。

回到顶部