Mi código funcionaba inicialmente, pero no sé por qué dejó de funcionar y me dio este error:
MongooseError: Operation `users.findOne()` buffering timed out after 10000ms at Timeout.<anonymous> (/Users/nishant/Desktop/Yourfolio/backend/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:184:20) at listOnTimeout (internal/timers.js:549:17) at processTimers (internal/timers.js:492:7)Estoy tratando de autenticar al usuario iniciando sesión con JWT. Mi cliente funciona bien, pero en mi backend aparece este error. Mi código de fondo:
import neuron from '@yummyweb/neuronjs' import bodyParser from 'body-parser' import cors from 'cors' import mongoose from 'mongoose' import emailValidator from 'email-validator' import passwordValidator from 'password-validator' import User from './models/User.js' import Portfolio from './models/Portfolio.js' import bcrypt from 'bcryptjs' import jwt from 'jsonwebtoken' import auth from './utils/auth.js' // Dot env import dotenv from 'dotenv' dotenv.config() // Custom Password Specifications // Username Schema const usernameSchema = new passwordValidator() usernameSchema.is().min(3).is().max(18).is().not().spaces() // Password Schema const passwordSchema = new passwordValidator() passwordSchema.is().min(8).is().max(100).has().uppercase().has().lowercase().has().digits().is().not().spaces() const PORT = process.env.PORT || 5000 const neuronjs = neuron() // Middleware neuronjs.use(bodyParser()) neuronjs.use(cors()) // Mongoose Connection mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true }, () => console.log("MongoDB Connected")) // API Routes neuronjs.POST('/api/auth/signup', async (req, res) => { const { username, email, password, passwordConfirmation } = req.body // Validation: all fields are filled if (!username || !email || !password || !passwordConfirmation) { return res.status(400).json({ "error": "true", "for": "fields", "msg": "fill all the fields" }) } // Validation: username is valid if (usernameSchema.validate(username, { list: true }).length !== 0) { return res.status(400).json({ "error": "true", "for": "username", "method_fail": usernameSchema.validate(username, { list: true }), "msg": "username is invalid" }) } // Validation: email is valid if (!emailValidator.validate(email)) { return res.status(400).json({ "error": "true", "for": "email", "msg": "email is invalid" }) } // Validation: password is valid if (passwordSchema.validate(password, { list: true }).length !== 0) { return res.status(400).json({ "error": "true", "for": "password", "method_fail": passwordSchema.validate(password, { list: true }), "msg": "password is invalid" }) } // Validation: password is confirmed if (password !== passwordConfirmation) { return res.status(400).json({ "error": "true", "for": "confirmation", "msg": "confirmation password needs to match password" }) } // Check for existing user with email const existingUserWithEmail = await User.findOne({ email }) if (existingUserWithEmail) return res.status(400).json({ "error": "true", "msg": "a user already exists with this email" }) // Check for existing user with username const existingUserWithUsername = await User.findOne({ username }) if (existingUserWithUsername) return res.status(400).json({ "error": "true", "msg": "a user already exists with this username" }) // Generating salt const salt = bcrypt.genSalt() .then(salt => { // Hashing password with bcrypt const hashedPassword = bcrypt.hash(password, salt) .then(hash => { const newUser = new User({ username, email, password: hash }) // Saving the user newUser.save() .then(savedUser => { const newPortfolio = new Portfolio({ user: savedUser._id, description: "", socialMediaHandles: { github: savedUser.username, dribbble: savedUser.username, twitter: savedUser.username, devto: savedUser.username, linkedin: savedUser.username, } }) // Save the portfolio newPortfolio.save() // Return the status code and the json return res.status(200).json({ savedUser }) }) .catch(err => console.log(err)) }) .catch(err => console.log(err)) }) .catch(err => console.log(err)) }) neuronjs.POST('/api/auth/login', async (req, res) => { try { const { username, password } = req.body // Validate if (!username || !password) { return res.status(400).json({ "error": "true", "msg": "fill all the fields", "for": "fields", }) } const user = await User.findOne({ username }) if (!user) { return res.status(400).json({ "error": "true", "msg": "no account is registered with this username", "for": "username" }) } // Compare hashed password with plain text password const match = await bcrypt.compare(password, user.password) if (!match) { return res.status(400).json({ "error": "true", "msg": "invalid credentials", "for": "password" }) } // Create JWT token const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET) return res.json({ token, user: { "id": user._id, "username": user.username, "email": user.email } }) } catch (e) { console.log(e) } }) // Delete a user and their portfolio neuronjs.DELETE("/api/users/delete", async (req, res) => { auth(req, res) const deletedPortfolio = await Portfolio.findOneAndDelete({ user: req.user }) const deletedUser = await User.findByIdAndDelete(req.user) res.json(deletedUser) }) neuronjs.POST("/api/isTokenValid", async (req, res) => { const token = req.headers["x-auth-token"] if (!token) return res.json(false) const verifiedToken = jwt.verify(token, process.env.JWT_SECRET) if (!verifiedToken) return res.json(false) const user = await User.findById(verifiedToken.id) if (!user) return res.json(false) return res.json(true) }) // Getting one user neuronjs.GET("/api/users/user", async (req, res) => { auth(req, res) const user = await User.findById(req.user) res.json({ "username": user.username, "email": user.email, "id": user._id }) }) // Getting the porfolio based on username neuronjs.GET("/api/portfolio/:username", async (req, res) => { try { const existingUser = await User.findOne({ username: req.params.username }) // User exists if (existingUser) { const userPortfolio = await Portfolio.findOne({ user: existingUser._id }) return res.status(200).json(userPortfolio) } // User does not exist else return res.status(400).json({ "error": "true", "msg": "user does not exist" }) } catch (e) { console.log(e) return res.status(400).json({ "error": "true", "msg": "user does not exist" }) } }) // Update Portfolio info neuronjs.POST("/api/portfolio/update", async (req, res) => { auth(req, res) // Find the portfolio const portfolio = await Portfolio.findOne({ user: req.user }) // Then, update the portfolio if (portfolio) { // Call the update method const updatedPortfolio = await portfolio.updateOne({ user: req.user, description: req.body.description, socialMediaHandles: req.body.socialMediaHandles, greetingText: req.body.greetingText, navColor: req.body.navColor, font: req.body.font, backgroundColor: req.body.backgroundColor, rssFeed: req.body.rssFeed, displayName: req.body.displayName, layout: req.body.layout, occupation: req.body.occupation }) return res.status(200).json(portfolio) } }) neuronjs.listen(PORT, () => console.log("Server is running on port " + PORT))La función del archivo auth.js:
import jwt from 'jsonwebtoken' const auth = (req, res) => { const token = req.headers["x-auth-token"] if (!token) return res.status(401).json({ "error": "true", "msg": "no authentication token" }) const verifiedToken = jwt.verify(token, process.env.JWT_SECRET) if (!verifiedToken) return res.status(401).json({ "error": "true", "msg": "token failed" }) req.user = verifiedToken.id } export default authCualquier ayuda es muy apreciada y ya probé algunas soluciones, como eliminar node_modules y volver a instalar mongoose.
En mi experiencia, esto sucede cuando su base de datos no está conectada. Intente verificar las siguientes cosas:
mongoose.connect(...) se está cargando. Enfrenté este problema en el que estaba ejecutando el node index.js desde mi terminal y el código de conexión de mongoose estaba en un archivo diferente. Después de requerir ese código de mangosta en index.js, estaba funcionando nuevamente.
Después de crear un clúster, haga clic en conectar y agregue su IP o agregue otra IP en MongoDB Atlas
Según la documentación que se encuentra en este enlace: https://mongoosejs.com/docs/connections.html#buffering
Mongoose le permite comenzar a usar sus modelos de inmediato, sin esperar a que Mongoose establezca una conexión con MongoDB.
Esto se debe a que la función del modelo de búfer mongoose llama internamente. Este almacenamiento en búfer es conveniente, pero también una fuente común de confusión. Mongoose no arrojará ningún error de forma predeterminada si usa un modelo sin conectarse.
TL;RD:
Su modelo está siendo llamado antes de que se establezca la conexión. Debe usar async/await con connect() o createConnection(); o use .then() , ya que estas funciones ahora devuelven promesas de Mongoose 5 .
mongoose.connect('mongodb://localhost/myapp', {useNewUrlParser: true});
Simplemente haga esto, agregue {useNewUrlParser: true} en el archivo de conexión.
Yo tuve el mismo problema. En mi caso, mantuve la declaración mongoose.connect en un archivo diferente y olvidé invocarla mientras escribía la declaración requerida.
require(./services/mongoose);Hice esto en mi archivo index.js y lo cambié a esto
require(./services/mongoose)();Me he encontrado con esto varias veces; particularmente cuando actualicé las dependencias anidadas que requieren mongoose. Esto siempre hace el truco para mí.
rm -rf node_modules rm package-lock.json npm install --package-lock-only npm installMi código funcionó normalmente desde una PC pero desde otra recibí el mismo error. Tengo alojamiento gratuito MongoDB por https://www.mongodb.com/ .
Lo arreglé agregando mi IP actual a Security - Network Access - IP Access List en el servidor de alojamiento.
Este error [ user.findOne() ] se muestra porque la versión de su paquete de config se actualiza automáticamente.
Introduce lo siguiente en tu terminal:
npm i -E config@3.3.1o
yarn add -E config@3.3.1bueno, mi problema se resolvió porque ya había un clúster, una colección hecha en mi mongo db atlas, todo lo que tenía que hacer era borrar eso y enviar otra solicitud de publicación para que funcione.
Tuve el mismo problema al usar Mongoose 6 . Me conecté a Mongoose en mi archivo index.js de la siguiente manera:
mongoose.connect( process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }, () => { console.log('Connected to MongoDB'); } );Encontré la siguiente información para Mongoose 6 en su sitio:
useNewUrlParser, useUnifiedTopology, useFindAndModify y useCreateIndex ya no son opciones compatibles. Mongoose 6 siempre se comporta como si useNewUrlParser, useUnifiedTopology y useCreateIndex fueran verdaderos y useFindAndModify fuera falso. Elimine estas opciones de su código.
Cuando eliminé la opción useCreateIndex: true , el problema se resolvió.
Asegúrese de conectarse a MongoDB en la parte superior de su función (archivo interno) y realizar operaciones (CRUD) después de conectarse a MongoDB Atlas.
Espero que tenga sentido. Recibí un error porque en mi archivo estoy cargando datos de otro servidor e insertándolos en mi MongoDB después de las operaciones asincrónicas que estoy conectando a mi servidor MongoDB, es por eso que recibí un error.
CORRECTO ↓
-
await mongoose.connect(MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, }); await parseAndLoadPlanetsData();INCORRECTO ↓
-
await parseAndLoadPlanetsData(); await mongoose.connect(MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, });Acabo de tener este problema cuando traté de usar mi base de datos mientras mi servidor tenía un error y mongoose creó un enorme panel de error de 87 partes que tuve que revisar y cuando lo hice, descubrí que las opciones que pasé a mongoose eran depreciado Entonces, si puede desplazarse hasta donde inicia su servidor, es posible que vea detalles que le indican que elimine o agregue ciertas opciones. Eliminar las opciones adicionales solucionó mi problema. 