Si uso await user.save() en el código a continuación, parece atascarse, pero si lo uso sin esperar, parece avanzar y en la respuesta se muestra la passwordResetToken . Sin embargo, en la base de datos, por alguna razón, el el resto de los campos se guardan pero passwordResetToken simplemente no se guarda.
Estoy completamente perdido acerca de cuál podría ser el motivo. Cualquier dirección sobre lo que debo buscar ayudaría.
exports.forgotPassword = async function(req, res, next) { // 1. Get user based on POST email const user = await User.findOne({ email: req.body.email }); // 2. Generate random token user.passwordResetToken = "123456"; await user.save({ validateBeforeSave: false }); // 3. Send it back as an email //4. Send Response res.status(200).json({ status: "success", data: { user: user, }, }); };esta es la respuesta
{ "status": "success", "data": { "user": { "role": "user", "_id": "6116aeb70aae0f7c7d8800bc", "name": "Jane Doe", "email": "jane@doe.com", "__v": 0, "passwordResetToken": "123456" } } } Sin embargo, el passwordResetToken todavía no lo guarda en la base de datos, aunque el resto sí. Tengo el passwordResetToken como un campo en mongoose.Schema
No había agregado esta sección a continuación a mi pregunta anterior, por lo que estoy agregando esto para ayudar a comprender dónde podría estar el problema.
Este es el modelo de usuario.js
const userSchema = new mongoose.Schema({ name: { type: String, required: [true, "Name is required"], }, email: { type: String, required: [true, "Email is required"], validate: [validator.isEmail, "Please provide valid email"], unique: true, }, role: { type: String, enum: ["admin", "lead-guide", "guide", "user"], default: "user", }, photo: String, password: { type: String, minlength: 8, required: [true, "Password is required"], select: false, }, passwordConfirm: { type: String, validate: { validator: function(el) { return el === this.password; }, message: "Password confirmation does not match with Password. Please try again", }, }, passwordChangedAt: Date, passwordResetToken: String, passwordResetExpires: Date, });y aquí está la línea de userRouter.js para esta ruta.
router.route("/forgotPassword").post(authController.forgotPassword);Tal vez puedas probar con
let user = await User.findOne({ email: req.body.email }); // 2. Generate random token user.passwordResetToken = "123456"; user = await user.save();o puedes usar
const user = await User.findOneAndUpdate({email:req.body.email},{$set:{passwordResetToken:'123456'},{new:true})new: true devolverá datos actualizados.
Asegúrese de que el archivo del modelo contenga el campo passwordResetToken. De lo contrario, será ignorado.
Me pregunto si el problema es con la solicitud HTTP, es posible que desee tener una solicitud http.post no http.put para su pregunta publicada.