MongooseError:操作 `users.findOneAndUpdate()` 缓冲在 10000 毫秒后超时

时间:2021-05-30 08:05:46

标签: node.js mongodb mongoose

我在使用 Mongoose 5.12.12 时遇到问题,每当我在 chrome 上访问 express 服务器时,我都会遇到

MongooseError: Operation `users.findOneAndUpdate()` buffering timed out after 10000ms

我已连接到我的数据库,因为在控制台中我得到“已连接到数据库”,但仅此而已。我登录,它给了我上面的错误。我对 mongoose 包很陌生,我正在关注 youtube 教程

这是我的代码,src/app.js

require('dotenv').config();
mongoose.createConnection(process.env.DATABASE_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(connection => {
    console.log("Connected to database")
})
mongoose.set("useFindAndModify", false)

这是用户架构:

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema( {
    discordId: {
        type: String,
        required: true,
        unique: true,
    },
    discordTag: {
        type: String,
        required: true
    },
    avatar: {
        type: String,
        required: true
    },
    guilds: {
        type: Array,
        required: true,
    }
})

module.exports = mongoose.model("User", UserSchema);

这里是 src/strategies/discord.js

passport.serializeUser((user, done) => {
    done(null, user.discordId)
});
passport.deserializeUser(async (discordId, done) => {
    try {
        const user = await User.findOne( {discordId} );
        return user ? done(null, user) : done(null, null)
    } catch (err) {
        console.log(err);
        done(err, null);
    }
})


passport.use(new DiscordStrategy({
    clientID: process.env.DASHBOARD_CLIENT_ID,
    clientSecret: process.env.DASHBOARD_CLIENT_SECRET,
    callbackURL: process.env.DASHBOARD_CALLBACK_URL,
    scope: ['identify', 'guilds'],
}, async (accesToken, refreshToken, profile, done) => {
    const { id, username, discriminator, avatar, guilds} = profile;
    try {
        const findUser = await User.findOneAndUpdate({discordId: id}, {
            discordTag: `${username}#${discriminator}`,
            avatar,
            guilds,
        }, {new: true});
        if (findUser) {
            console.log('user was found')
            return done(null, findUser);
        } else {
            const newUser =  await User.create({
                discordId: id,
                discordTag: `${username}#${discriminator}`,
                avatar,
                guilds,
            })
            return done(null, newUser)
        }
    } catch (err) {
        console.log(err);
        return done(err, null)
    }
}))

1 个答案:

答案 0 :(得分:0)

试试这个

const mongoose = require('mongoose');
require('dotenv').config();

const connectToMongo = async() => {
    await mongoose.connect(process.env.DATABASE_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useFindAndModify: false,
    });
    return mongoose;
};

await connectToMongo().then(async() => console.log('connected yeee'));

这应该有效,因为您的模型在建立连接之前被调用。您需要将 async/await 与 connect() 或 createConnection() 一起使用;或使用 .then()