简体   繁体   中英

findOneAndUpdate is not a function of mongoose

I know this question has been answered before but I can't seem to implement the changes into what im working with. I'm trying to create a daily command that rewards a user for doing s.daily, I get the error,

TypeError: profileData.findOneAndUpdate is not a function

at Object.execute (C:\Users--\Desktop\DiscBot\commands\daily.js:35:43)

at module.exports (C:\Users--\Desktop\DiscBot\events\client\message.js:34:13)

daily.js, one having error at line 35 for findOneAndUpdate is not a function

const Schema = require('../models/profileSchema')
//cache users that claim daily rewards
let claimedCache = []

const clearCache = () => {
  claimedCache = []
  setTimeout(clearCache, 1000 * 60 * 10)
}
clearCache()
//message to make it easier later
const alreadyClaimed = 'You have already claimed your daily rewards'

module.exports = {
    name: "daily",
    aliases: ["day", "d"],
    permissions: [],
    description: "Claim your daily rewards!",
    async execute(message, args, cmd, client, Discord, profileData) {

    const { serverID, member } = message
    const { id } = member
//If user is in cache return message
    if (claimedCache.includes(id)) {
      console.log('Returning from cache')
      message.reply(alreadyClaimed)
      return
    }
//Put everything in object for later
    const obj = {
      guildId: serverID,
      userId: id,
    }
//Results is an update that either updates if is user is not in array and doesn't if they are, but it doesn't know what findOneAndUpdate is (thought it was just a mongo/mongoose function??)
      try {
        const results = await profileData.findOneAndUpdate(obj)

        console.log('RESULTS:', results)

        if (results) {
          const then = new Date(results.updatedAt).getTime()
          const now = new Date().getTime()

          const diffTime = Math.abs(now - then)
          const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24))

          if (diffDays <= 1) {
            claimedCache.push(id)

            message.reply(alreadyClaimed)
            return
          }
        }
//after the update increase coins by 50 and send claimed message
        await profileRewardsSchema.findOneAndUpdate(obj, obj, {
          upsert: true,
        })

        claimedCache.push(id)
        const amount = 50;
        await profileModel.findOneAndUpdate(
            {
              userID: id,
            },
            {
              $inc: {
                coins: amount,
              },
            }
          );
        message.reply('You have claimed your daily rewards!')
      }catch (err) {
        console.log(err);
      }
    }
}

message.js, heres where I make profileModel a thing using mongoose to pass it into my commands

const profileModel = require("../../models/profileSchema");
const config = require('../../config.json');

module.exports = async (Discord, client, message) => {
    //command handler start

    const prefix = 's!';
    if (!message.content.startsWith(prefix) || message.author.bot) return;

    //database junk
    let profileData;
    try {
      profileData = await profileModel.findOne({ userID: message.author.id });
      if (!profileData) {
        let profile = await profileModel.create({
          userID: message.author.id,
          serverID: message.guild.id,
          coins: 10,
          bank: 0,
        });
        profile.save();
      }
    } catch (err) {
      console.log("Error creating new database profile");
    }
    
    const args = message.content.slice(prefix.length).split(/ +/);
    const cmd = args.shift().toLowerCase();
  
    const command = client.commands.get(cmd)  || client.commands.find(a => a.aliases && a.aliases.includes(cmd));
   
    if(!command) return message.channel.send(":x: This is not a valid command");
    try {
    command.execute(message, args, cmd, client, Discord, profileData);
    } catch (err) {
      message.reply('There was an error executing that command!');
    }
};

profileSchema.js, Where profile is made into mongo database

const mongoose = require("mongoose");

const profileSchema = new mongoose.Schema({
  userID: { type: String, require: true, unique: true },
  serverID: { type: String, require: true },
  coins: { type: Number, default: 10 },
  bank: { type: Number },
},
  {
    timestamps: true,
  }
)
const model = mongoose.model("ProfileModels", profileSchema);
module.exports = model;

main.js, where mongoose is connected, then passed on

mongoose.connect(process.env.MONGODB_SRV, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false
})

You are trying to call findOneAndUpdate on the document, which you passed to execute function at message.js. Check the example of how to use findOneAndUpdate

https://mongoosejs.com/docs/tutorials/findoneandupdate.html

I guess findOneAndUpdate takes two relevant parameters (filter): the data to be updated, and the payload.

Check mongoosedocs for more info.

Most of the time this error happen when you call findOneAndUpdate in mongoose when you call it on the instance of the model NOT the actual model

so instead of this

var NewUser = new User(req.user);
NewUser.findOneAndUpdate...

do this

var NewUser = new User(req.user);
User.findOneAndUpdate(
        { name: NewUser.name },
        { name: NewUser.name},
        { upsert: true });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM