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

NodeJS+Mongoose创建MongoDB条目成功后无法查询的求助

问题:Mongoose创建文档成功但查询时提示Client未定义

我正在开发NodeJS服务器,使用mongoose连接MongoDB,创建条目成功后无法查询,触发Client is not defined错误,已通过MongoDB Compass确认条目存在。

相关代码

Client.js(模型文件)

import mongoose from 'mongoose';

const clientSchema = new mongoose.Schema({
    hwid: {
        type: String,
        required: true,
        unique: true,
    },
    ip: {
        type: String,
        required: true,
    },
    timestamp: {
        type: Date,
        default: Date.now,
    },
    publicKey: String,
    privateKey: String,
    bitcoinAddress: String,
});

const Client = mongoose.model('Client', clientSchema);

export default Client;

db.js(数据库操作工具)

import mongoose from 'mongoose';
import Client from '../models/Client.js';
import { generateKeyPair } from 'crypto';

export const connectToDatabase = async (databaseURL) => {
    try {
        await mongoose.connect(databaseURL);
        console.log(`[i] Connected to MongoDB at: ${databaseURL}`);
    } catch (error) {
        console.error('[!] Error connecting to MongoDB:', error.message);
        process.exit(1);
    }
};

export const disconnectFromDatabase = async () => {
    try {
        await mongoose.disconnect();
        console.log('[i] Disconnected from MongoDB');
    } catch (error) {
        console.error('[!] Error disconnecting from MongoDB:', error.message);
    }
};

export const generateRSAKeys = async () => {
    return new Promise((resolve, reject) => {
        generateKeyPair('rsa', {
            modulusLength: 2048,
            publicKeyEncoding: {
                type: 'spki',
                format: 'pem',
            },
            privateKeyEncoding: {
                type: 'pkcs8',
                format: 'pem',
            },
        }, (err, publicKey, privateKey) => {
            if (err) {
                reject(err);
            } else {
                resolve({ publicKey, privateKey });
            }
        });
    });
};

export const createClient = async (hwid, ip) => {
    try {
        const existingClient = await Client.findOne({ hwid });

        if (!existingClient) {
            const { publicKey, privateKey } = await generateRSAKeys();
            const newClient = new Client({
                hwid,
                ip,
                publicKey,
                privateKey,
            });
            await newClient.save();
            console.log(`[+] New user created: ${hwid}`);
            return true;
        } else {
            console.log(`[i] User already exists: ${hwid} aborting...`);
            return false;
        }

    } catch (error) {
        console.error('[!] Error in createClient:', error.message);
        return false;
    }
};

测试脚本test.js

import { connectToDatabase, createClient, disconnectFromDatabase } from './utils/db.js';

const databaseURL = 'mongodb://127.0.0.1:27017/wbs_clients';

const testCreateClient = async () => {
    try {
        await connectToDatabase(databaseURL);
        const result = await createClient('testHWID', '127.0.0.1');
        if (result) {
            const createdClient = await Client.findOne({ hwid: 'testHWID' });
            console.log('[i] Client details:', createdClient);
        } else {
            console.log('[i] createClient failed');
        }
    } catch (error) {
        console.error('[!] Error in testCreateClient:', error.message);
    } finally {
        await disconnectFromDatabase();
    }
};
testCreateClient();

运行输出

D:\WMP\Training\WBS-C2>node .\src\test.js
Debugger attached.
[i] Connected to MongoDB at: mongodb://127.0.0.1:27017/wbs_clients
[+] New user created: testHWID
[!] Error in testCreateClient: Client is not defined
[i] Disconnected from MongoDB
Waiting for the debugger to disconnect...

解决方案

1. 修复测试脚本的模型导入问题

错误原因是测试脚本中调用Client.findOne()但未导入Client模型,修改test.js:

import { connectToDatabase, createClient, disconnectFromDatabase } from './utils/db.js';
// 新增Client模型导入
import Client from './models/Client.js';

const databaseURL = 'mongodb://127.0.0.1:27017/wbs_clients';

const testCreateClient = async () => {
    try {
        await connectToDatabase(databaseURL);
        const result = await createClient('testHWID', '127.0.0.1');
        if (result) {
            const createdClient = await Client.findOne({ hwid: 'testHWID' });
            console.log('[i] Client details:', createdClient);
        } else {
            console.log('[i] createClient failed');
        }
    } catch (error) {
        console.error('[!] Error in testCreateClient:', error.message);
    } finally {
        await disconnectFromDatabase();
    }
};
testCreateClient();

2. 优化建议:减少重复查询

可以修改createClient函数,直接返回创建/查询到的客户端文档,避免后续重复查询数据库:

export const createClient = async (hwid, ip) => {
    try {
        const existingClient = await Client.findOne({ hwid });

        if (!existingClient) {
            const { publicKey, privateKey } = await generateRSAKeys();
            const newClient = new Client({
                hwid,
                ip,
                publicKey,
                privateKey,
            });
            const savedClient = await newClient.save();
            console.log(`[+] New user created: ${hwid}`);
            // 返回创建好的文档
            return savedClient;
        } else {
            console.log(`[i] User already exists: ${hwid} aborting...`);
            // 返回已存在的文档
            return existingClient;
        }

    } catch (error) {
        console.error('[!] Error in createClient:', error.message);
        return null;
    }
};

对应的测试脚本可简化为:

const testCreateClient = async () => {
    try {
        await connectToDatabase(databaseURL);
        const client = await createClient('testHWID', '127.0.0.1');
        if (client) {
            console.log('[i] Client details:', client);
        } else {
            console.log('[i] createClient failed');
        }
    } catch (error) {
        console.error('[!] Error in testCreateClient:', error.message);
    } finally {
        await disconnectFromDatabase();
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:20:30