You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中MongoDB用户检查函数返回undefined问题求助

问题分析

你的isUserExists函数返回undefined有两个核心原因:

  • 函数本身无返回值:isUserExists内部仅执行异步MongoDB连接操作,未向外返回任何数据,默认返回undefined
  • 异步回调的return无效:回调函数findUser里的return false/true仅属于该回调函数,不会传递到外层的isUserExists函数

另外你的查询结果判断逻辑存在错误:result.value === arr.value完全不符合预期,toArray返回的是匹配到的用户数组,直接判断数组长度即可。

解决方案

重构代码使用Promise+async/await处理异步操作,同时修复查询判断逻辑:

修复后的CheckService代码

const express = require("express");
const mongoDB = require('mongodb').MongoClient;
const url = "your database url";

class CheckService {
    // 改为async函数,返回Promise
    async isUserExists(username) {
        let connection;
        try {
            // 建立数据库连接
            connection = await mongoDB.connect(url);
            const db = connection.db("users");
            const query = {name: username};
            
            // 查询匹配的用户,返回数组
            const result = await db.collection("users").find(query).toArray();
            
            // 判断数组长度,大于0说明用户存在
            const exists = result.length > 0;
            console.log(exists);
            return exists;
        } catch (error) {
            console.log("Error", '\n', error);
            throw error;
        } finally {
            // 无论成功失败都关闭连接
            if (connection) {
                await connection.close();
            }
        }
    }
}

module.exports = new CheckService();

调用方式(需在async函数中使用await)

const checkService = require('./check.service'); 

// 示例:在路由处理函数中调用
async function userCheckHandler(req, res) {
    const username = req.body.username; // 假设从请求中获取用户名
    try {
        const exists = await checkService.isUserExists(username);
        console.log('function:', exists);
        // 后续业务逻辑处理
    } catch (error) {
        // 捕获并处理错误
        console.error('检查用户存在性失败:', error);
    }
}

额外优化建议

  • 复用数据库连接:每次调用都创建新连接会降低性能,建议在应用启动时建立一次连接,后续复用,而非每次调用isUserExists都重新连接
  • 简化查询逻辑:若仅需判断用户是否存在,无需获取所有匹配数据,可使用findOne替代find().toArray(),性能更优:
    const user = await db.collection("users").findOne(query);
    const exists = !!user; // 转换为布尔值判断
    

内容的提问来源于stack exchange,提问作者user20300075

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:20:16