我只是學習如何使用 Im 嘗試將資料添加到 mongoDB 并使用.findOne 函式來構建資料庫,但我收到了這個錯誤。findOne 是 MongoDB 中的一個函式嗎?
我的目標是嘗試構建一個完整的堆疊移動應用程式并使用 mongoDB 作為資料庫。前端顫抖。我正在嘗試使用 socket.io 將資料從顫振發送到 mongoDB。
您可能會問自己,如果我只是需要將資料保存到 MongoDB,我正在使用 socket.io。嗯,應用程式構建是多個用戶可以加入一個房間并相互互動的游戲。
這是用于構建這些后端的版本"mongoose": "^6.3.3", "socket.io": "^2.3.0"
TypeError: Room.findOne is not a function
at Socket.<anonymous> (/Users/Paul/Documents/server/Index.js:27:45)
at Socket.emit (node:events:390:28)
at /Users/Paul/Documents/server/node_modules/socket.io/lib/socket.js:528:12
at processTicksAndRejections (node:internal/process/task_queues:78:11)
Index.js
這是我的主要檔案
const express = require("express");
var http = require("http")
const app = express();
const port = process.env.PORT || 3000;
var server = http.createServer(app);
const mongoose = require("mongoose");
const Room = require('./models/Room');
//adding socket IO and passing the variable server to it.
var io = require("socket.io")(server);
//middleware
app.use(express.json());
//connecting to MongoDB
const DB = 'mongodb srv://user:[email protected]/?retryWrites=true&w=majority';
mongoose.connect(DB).then(() => {
console.log('Connection Successful!');
}).catch((e) =>{
console.log(e);
})
io.on('connection', (socket) => {
console.log('connected!');
socket.on('create-game', async({nickname, name, numRounds, occupancy}) => {
try {
const existingRoom = await Room.findOne({name});
if(existingRoom){
socket.emit('notCorrectGame', 'Room with that name already exists!');
return;
}
let room = new Room();
const word = getWord();
room.word = word;
room.roomName = roomName;
room.occupnacy = occupnacy;
room.numRounds = numRounds;
let player = {
socketID: socket.id,
nickname,
isPartyLeader: true,
}
room.players.push(player);
room = await room.save();
socket.join(room);
io.to(roomName).emit('updateRoom', room);
} catch (error) {
console.log(error);
}
})
})
server.listen(port, "0.0.0.0", () => {
console.log('Server started and running on port ' port);
})
Player.js
const mongoose = require('mongoose');
const PlayerSchema = new mongoose.Schema({
nickname: {
type: String,
trim: true,
},
socketID: {
type: String,
},
isPartyLeader: {
type: Boolean,
default: false,
},
points: {
type: Number,
default: 0,
}
})
const playermodel = mongoose.model('Player', PlayerSchema);
module.exports = {playermodel, PlayerSchema}
Room.js
const mongoose = require("mongoose");
const { PlayerSchema } = require("./Player");
var roomSchema = new mongoose.Schema({
word: {
required: true,
type: String,
},
name: {
required: true,
type: String,
unique: true,
trim: true,
},
occupancy: {
required: true,
type: Number,
default: 4
},
maxRounds: {
required: true,
type: Number,
},
currentRound: {
required: true,
type: Number,
default: 1,
},
players: [PlayerSchema],
isJoin: {
type: Boolean,
default: true,
},
turn: PlayerSchema,
turnIndex: {
type: Number,
default: 0
}
});
const gameModel = new mongoose.model('Room', roomSchema);
module.exports = {gameModel, roomSchema};
老實說,我無法弄清楚為什么會遇到此錯誤。也許,我只需要第二只眼睛來幫助我。
任何人都可以幫助解決這個錯誤嗎?請提前謝謝您!
uj5u.com熱心網友回復:
您的錯誤位于此處:
io.on('connection', (socket) => {
console.log('connected!');
socket.on('create-game', async({nickname, name, numRounds, occupancy}) => {
try {
//error is here
const existingRoom = await Room.findOne({name});
if(existingRoom){
socket.emit('notCorrectGame', 'Room with that name already exists!');
return;
}
解釋:
現在,findOne是 mongoDB 集合/貓鼬模型中的一個函式。這意味著const Room必須是一個集合供您呼叫Room.findOne()
但是,根據您的 index.js 檔案,當您呼叫 Room 時,您并沒有獲取 mongodb 集合/貓鼬模型。
const Room = require('./models/Room');
這是因為根據Mongoose 檔案,匯出的Room.js不僅僅是{gameModel, roomSchema}您的模型,而是您應該呼叫該函式的模型。因此 ,沒有函式const Room = {gameModel, roomSchema}findOne()
修理:
當您像這樣匯入模式和模型時,嘗試物件解構模式和模型。
const {gameModel: Room, roomSchema} = require('./models/Room')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/478047.html
標籤:javascript 节点.js 数据库 mongodb 猫鼬
下一篇:是否可以使用存盤程序檢索表?
