Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongooseError: Model.findOne() no longer accepts a callback at Function

I've encountered a problem while setting up mongoose.

Here is my code:

const { SlashCommandBuilder } = require('@discordjs/builders');
const testSchema = require(`../../Schemas.js/test`);

module.exports = {
    data: new SlashCommandBuilder()
    .setName('dbtest')
    .setDescription('db test'),
    async execute(interaction) {

        testSchema.findOne({ GuildID: interaction.guild.id, UserID: interaction.user.id}, async(err, data) => {
            if (err) throw err;

            if (!data) {
                testSchema.create({
                    GuildID: interaction.guild.id,
                    UserID: interaction.user.id
                })
            }

            if (data) {
                console.log(data)
            }
        })
    }
}

My error:

/Users/akimfly/akim-slash-bot/node_modules/mongoose/lib/model.js:2131
    throw new MongooseError('Model.findOne() no longer accepts a callback');
          ^

MongooseError: Model.findOne() no longer accepts a callback
    at Function.findOne (/Users/akimfly/akim-slash-bot/node_modules/mongoose/lib/model.js:2131:11)
    at Object.execute (/Users/akimfly/akim-slash-bot/src/commands/Community/databasetest.js:10:20)
    at Object.execute (/Users/akimfly/akim-slash-bot/src/events/interactionCreate.js:12:21)
    at Client.<anonymous> (/Users/akimfly/akim-slash-bot/src/functions/handleEvents.js:8:58)
    at Client.emit (node:events:513:28)
    at InteractionCreateAction.handle (/Users/akimfly/akim-slash-bot/node_modules/discord.js/src/client/actions/InteractionCreate.js:97:12)
    at module.exports [as INTERACTION_CREATE] (/Users/akimfly/akim-slash-bot/node_modules/discord.js/src/client/websocket/handlers/INTERACTION_CREATE.js:4:36)
    at WebSocketManager.handlePacket (/Users/akimfly/akim-slash-bot/node_modules/discord.js/src/client/websocket/WebSocketManager.js:352:31)
    at WebSocketShard.onPacket (/Users/akimfly/akim-slash-bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:489:22)
    at WebSocketShard.onMessage (/Users/akimfly/akim-slash-bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:328:10)
like image 902
akim Avatar asked Jan 25 '26 14:01

akim


1 Answers

Mongo dropped support for callbacks from its node.js driver as of version 5.0 in favour of a Promise-only public API. Mongoose also dropped callback support in v7 so findOne() and other methods now always return a promise.

The full list of methods affected can be found here.

You can use async/await instead:

module.exports = {
  data: new SlashCommandBuilder().setName('dbtest').setDescription('db test'),
  async execute(interaction) {
    try {
      const data = await testSchema.findOne({
        GuildID: interaction.guild.id,
        UserID: interaction.user.id,
      });

      if (!data) {
        testSchema.create({
          GuildID: interaction.guild.id,
          UserID: interaction.user.id,
        });
      }

      if (data) {
        console.log(data);
      }
    } catch (error) {
      console.log(error);
    }
  },
};

Or just good old thens:

module.exports = {
  data: new SlashCommandBuilder().setName('dbtest').setDescription('db test'),
  execute(interaction) {
    testSchema
      .findOne({
        GuildID: interaction.guild.id,
        UserID: interaction.user.id,
      })
      .then((data) => {
        if (!data) {
          testSchema.create({
            GuildID: interaction.guild.id,
            UserID: interaction.user.id,
          });
        }

        if (data) {
          console.log(data);
        }
      })
      .catch((err) => console.log(err));
  },
};
like image 172
Zsolt Meszaros Avatar answered Jan 27 '26 03:01

Zsolt Meszaros



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!