在Express中创建Mongoose集合:代码实现相关技术问询
在Express中使用Mongoose创建集合并保存游戏统计数据的完整指南
看起来你已经搭好了Express + Socket.io + Mongoose的基础框架,但还差几个关键步骤才能让游戏统计数据成功存入MongoDB集合。我来帮你一步步完善:
1. 确保Gamestat模型的定义正确
你已经引入了./models/gamestat,但这个文件里必须正确定义Mongoose的Schema和模型,MongoDB才会自动创建对应的集合(集合名默认是模型名的复数形式,也就是gamestats)。
在./models/gamestat.js中添加以下代码:
const mongoose = require('mongoose'); // 定义游戏统计数据的Schema const gameStatSchema = new mongoose.Schema({ time: { type: String, required: true }, winner: { type: String, required: true }, loser: { type: String, required: true }, moves: { type: String, required: true } }); // 创建并导出模型 module.exports = mongoose.model('Gamestat', gameStatSchema);
2. 完善数据库连接的状态监听
你的数据库连接代码缺少错误处理和连接成功的确认,加上这些可以帮你快速排查连接问题:
const mongoose = require('mongoose'); const config = require('./config/database'); mongoose.connect(config.database, { useMongoClient: true }); const db = mongoose.connection; // 监听数据库连接错误 db.on('error', console.error.bind(console, 'MongoDB连接错误:')); // 监听数据库连接成功 db.once('open', () => { console.log('已成功连接到MongoDB数据库'); });
注意:如果你的Mongoose版本较新,useMongoClient选项已被弃用,可以改用useNewUrlParser: true, useUnifiedTopology: true来避免控制台警告。
3. 完善gameEnded事件中的数据保存逻辑
你已经创建了newStat实例,但没有执行保存操作。需要调用save()方法把数据存入数据库,同时处理异步操作的结果:
io.on('connection', (socket) => { // 其他Socket.io逻辑... socket.on('gameEnded', (data) => { socket.broadcast.to(data.room).emit('gameEnd', data); // 创建游戏统计数据实例,建议用socket传递的真实数据替换测试值 let newStat = new Gamestat({ time: new Date().toLocaleString(), // 替换为真实的游戏结束时间 winner: data.winner, // 从data中获取真实赢家ID/昵称 loser: data.loser, // 从data中获取真实输家ID/昵称 moves: data.moves.toString() // 从data中获取真实步数统计 }); // 保存数据到数据库 newStat.save((err, stat) => { if (err) { console.error('保存游戏统计数据失败:', err); return; } console.log('游戏统计数据已成功保存:', stat); }); // 如果你习惯用async/await写法,也可以这样写: // try { // const savedStat = await newStat.save(); // console.log('游戏统计数据已成功保存:', savedStat); // } catch (err) { // console.error('保存游戏统计数据失败:', err); // } }); });
4. 完整的database.js配置示例
补全你的数据库配置文件:
module.exports = { database: 'mongodb://localhost:27017/你的数据库名称' // 替换为你的数据库名,比如game_stats_db };
完成以上步骤后,当gameEnded事件触发时,Mongoose会自动创建gamestats集合(如果不存在的话),并把游戏统计数据存入其中。
内容的提问来源于stack exchange,提问作者Peplm
相关产品推荐
相关产品推荐

