Estoy usando "mongoose": "^5.7.1"
en mi proyecto Node.js. Estoy haciendo una API que implica la actualización en dos documentos. Entonces, estoy usando las transacciones como las siguientes:
// Start the transaction
session = await mongoose.startSession()
session.startTransaction()
await Promise.all([
<1st update operation>,
<2nd update operation>
])
// Commit the transaction
session.commitTransaction()
Cuando llego a esta API en mi entorno local, aparece el siguiente error:
MongoError: esta implementación de MongoDB no admite escrituras recuperables. Agregue retryWrites = false a su cadena de conexión.
Cuando presiono esta API en un entorno remoto, entonces funciona bien. Estoy usando https://www.clever-cloud.com como nube de base de datos y AWS como nube de API.
Como está escrito en el mensaje de error, he intentado poner retryWrites=false
- al final de la cadena de conexión que estoy pasando a mangosta como
mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
- con opciones
retryWrites: false
pasadas almongoose.connect
método.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
retryWrites: false
}, (err) => {...})
Ninguno de los anteriores resolvió el problema.
A continuación se muestra la salida del mongo --version
comando:
db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
He depurado y encuentro que el error real detrás de lanzar este error es:
MongoError: los números de transacción solo se permiten en un miembro de conjunto de réplica o mongos
Por favor sugiera algo.
Respuestas:
Las transacciones son, sin duda, la nueva característica más emocionante de MongoDB 4.0. Pero desafortunadamente, la mayoría de las herramientas para instalar y ejecutar MongoDB inician un servidor independiente en lugar de un conjunto de réplicas. Si intenta iniciar una sesión en un servidor independiente, obtendrá este error.
Este problema se puede resolver mediante el uso de conjuntos de réplicas en su entorno local.
He usado corredores para este propósito.
fuente
Como se sugiere en la respuesta aceptada, debe tener su servidor local para que se ejecute como un conjunto de réplicas para poder realizar transacciones, en lugar de un servidor independiente.
Sin embargo, además de la solución propuesta, puede convertir fácilmente su base de datos local independiente en un conjunto de réplicas sin usar ninguna herramienta de terceros , siguiendo las instrucciones en la documentación de MongoDB , resumidas de la siguiente manera:
replSet
argumento.mongo
shell e inicie el nuevo conjunto de réplicas.¡Ahora debería tener un conjunto de réplicas en lugar de un servidor mongodb independiente, donde puede realizar transacciones en su entorno local para actualizar varios documentos a la vez!
No olvide incluir el
replSet
argumento cada vez que desee iniciar el servidor; de lo contrario, se iniciará como Independiente. Simplemente uso el mismo comando que en el paso 1 para ejecutarlo nuevamente.Alternativamente, puede implementar un nuevo conjunto de réplica desde cero para probar el entorno siguiendo estas otras instrucciones en la documentación de MongoDB.
fuente
Edite el
App/Config/database
archivo Agregar'retryWrites'=>false
en la cadena de conexión Mongodbescribir conexión Mongo db
Guardar y correr
fuente
Intenta agregar
&retryWrites=false
a tu cadena de conexión-
De hecho, recibí los errores mencionados en el OP cuando me conecté a nuestro servidor de base de datos remoto, mientras funcionaba localmente. Me puse en contacto con nuestro soporte alojado por mongo antes de probar la sugerencia que aparece en el error.
-
Esto es lo que dijo nuestro sitio alojado de mongo (mLab):
Es probable que el controlador de su aplicación se haya actualizado a una versión más reciente que intenta utilizar una función exclusiva de WiredTiger. Como se menciona en el error, deberá agregar & retryWrites = false a su cadena de conexión.
https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error
fuente