Hello i've been trying to implement transanctions to my crud operations on my mongodb atlas using mongoose, i have tried to look up for tutorials and stuff, but there really aren't that many around, i have this problem of "ClientSession cannot be serialized to BSON" after i try to hit a user create route, my code:
router.post(
'/',
[
check('name', 'Por favor, ingresar el nombre')
.not()
.isEmpty(),
check('email', 'Por favor, ingresar un correo válido').isEmail(),
check(
'password',
'Por favor, ingresar una contraseña con 6 o más carácteres'
).isLength({ min: 6 })
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { name, email, password, imagen } = req.body;
const session = await User.startSession() // Las transacciones usan sesiones
// const session = await mongoose.startSession() // Las transacciones usan sesiones
session.startTransaction() // Empezar una transacción
try {
const opts = {session} // Opciones de consulta del modelo
const user = await User.findOne({ email }, opts ); // Enviar opts para usar transac
if (user) {
return res
.status(400)
.json({ errors: [{ msg: 'Ya existe una cuenta creada con este correo' }] });
}
user = new User({
name,
email,
password,
imagen
});
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);
await user.save(opts);
const payload = {
user: {
id: user.id
}
};
jwt.sign(
payload,
config.get('jwtSecret'),
{ expiresIn: 360000 }, // Cambiar a 3600 en producción 3600s = 1 hora
(err, token) => {
if (err) throw err;
res.json({ token });
}
);
await session.commitTransaction(); // Commit de la transacción
session.endSession(); // Terminar la sesión
return true
} catch (err) {
await session.abortTransaction(); // Abortar o rollback de la transacción
session.endSession(); // Terminar la sesión
console.error(err.message);
res.status(500).send('Error del servidor');
}});
So, im not really sure what this means, i would really like to know what are the basic steps into mongoose transactions to kind of grasp the main concept, thanks.