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
相关产品推荐
相关产品推荐

