如何检索并显示存储在 MongoDB 数据库中的信息?

问题描述 投票:0回答:1

我目前正在编写一个 NodeJS 服务器,并尝试连接到我的 MongoDB 数据库,因此我使用

mongoose
。问题是,在数据库中成功创建条目后,我的服务器找不到它并认为存在错误。

这是我的“客户端”对象和我的数据库函数:

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;
    }
};

最后,这是我的测试脚本:

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...

但是,我在

MongoDB Compass
上注意到“testHWID”客户端已创建。

你能帮我检索并显示数据库中存储的信息吗?

javascript node.js mongodb mongoose
1个回答
0
投票

您需要将

Client
导入到测试脚本中。它可用于
createClient
函数,因为您将其导入到
db.js
中,但从未从该文件中导出。

import { connectToDatabase, createClient, disconnectFromDatabase } from './utils/db.js';
import Client from '../models/Client.js'; //< Add this
//...
//...
© www.soinside.com 2019 - 2024. All rights reserved.