ClientSession 无法序列化为 BSON

Ari*_*lón 3 transactions mongoose node.js

你好,我一直在尝试使用 mongoose 在我的 mongodb 图集上对我的 crud 操作实施交易,我试图查找教程和东西,但周围真的没有那么多,我有这个问题“ClientSession 不能在我尝试点击用户创建路由后序列化为 BSON”,我的代码:

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');
}});
Run Code Online (Sandbox Code Playgroud)

所以,我不太确定这意味着什么,我真的很想知道猫鼬交易的基本步骤是什么,以了解主要概念,谢谢。

小智 5

我遇到过同样的问题。所以尝试更换

const user = await User.findOne({ email }, opts );
Run Code Online (Sandbox Code Playgroud)

接着就,随即:

const user = await User.findOne({ email }, null, opts );
Run Code Online (Sandbox Code Playgroud)

它解决了我的问题:)

  • ```User.findOne({ email }, opts).session(session)``` 也有效 (3认同)