Se me presento un error el cual era:
TypeError: rxjs_1.lastValueFrom is not a function
la solucion para esto, fue cambiar la version de rxjs
npm i rxjs@^7
Utilizar el driver oficial de MongoDB para NestJS es una buena manera de trabajar y relacionar estos dos mundos. Pero existe una forma mucho más profesional y amigable que te ayudará a trabajar más rápido y cometer menos errores.
¿Qué es Mongoose como ODM?
Mongoose es un ODM (Object Data Modeling) que permite realizar un mapeo de cada colección de tu base de datos MongoDB a través de esquemas. Estos te ayudarán a acceder a los datos, realizar consultas complejas y estandarizar la estructura de los mismos.
En MongoDB, al ser NoSQL, puedes guardar lo que quieras, en el orden que quieras y con la estructura que quieras. Esto es una muy mala práctica que tienes que evitar ya que traerá serios problemas en un futuro no muy lejano en tu proyecto. Los ODM llegan para solucionar esto.
Cómo instalar Mongoose
Te dejamos esta serie de pasos para utilizar Mongoose.
Paso 1: instalación de Mongoose
Además de la instalación de Mongoose, NestJS posee su propia librería que te ayudará a crear los esquemas, inyectar los servicios y ejecutar las consultas a tu base de datos.
npm install --save @nestjs/mongoose mongoose
Paso 2: importación y configuración de Mongoose
Importa el módulo MongooseModule y pásale la cadena de conexión utilizando, o no, variables de entorno.
import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ MongooseModule.forRoot( `${process.env.MONGO_CONF}://${process.env.MONGO_USER}:${process.env.MONGO_PASS}@${process.env.MONGO_HOST}/${process.env.MONGO_BBDD}` ) ] }) export class AppModule { }
De esta manera, habrás realizado la conexión de tu base de datos a través de Mongoose, en lugar de utilizar el driver oficial.
Contribución creada por: Kevin Fiorentino.
Código de ejemplo para instalación de Mongoose
npm install --save @nestjs/mongoose mongoose
// src/database/database.module.ts import { MongooseModule } from '@nestjs/mongoose'; // 👈 Import @Global() @Module({ imports: [ // 👈 MongooseModule.forRootAsync({ // 👈 Implement Module useFactory: (configService: ConfigType<typeof config>) => { const { connection, user, password, host, port, dbName, } = configService.mongo; return { uri: `${connection}://${host}:${port}`, user, pass: password, dbName, }; }, inject: [config.KEY], }), ], providers: [ { provide: 'API_KEY', inject: [config.KEY], }, ], exports: ['API_KEY', 'MONGO', MongooseModule], // 👈 add in exports }) export class DatabaseModule {}
Utilizar el driver oficial de MongoDB para NestJS es una buena manera de trabajar y relacionar estos dos mundos. Pero existe una forma mucho más profesional y amigable que te ayudará a trabajar más rápido y cometer menos errores.
Mongoose es un ODM (Object Data Modeling) que permite realizar un mapeo de cada colección de tu base de datos MongoDB a través de esquemas. Estos te ayudarán a acceder a los datos, realizar consultas complejas y estandarizar la estructura de los mismos.
En MongoDB, al ser NoSQL, puedes guardar lo que quieras, en el orden que quieras y con la estructura que quieras. Esto es una muy mala práctica que tienes que evitar ya que traerá serios problemas en un futuro no muy lejano en tu proyecto. Los ODM llegan para solucionar esto.
Te dejamos esta serie de pasos para utilizar Mongoose.
Además de la instalación de Mongoose, NestJS posee su propia librería que te ayudará a crear los esquemas, inyectar los servicios y ejecutar las consultas a tu base de datos.
npm install --save @nestjs/mongoose mongoose
Importa el módulo MongooseModule y pásale la cadena de conexión utilizando, o no, variables de entorno.
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [
MongooseModule.forRoot( `${process.env.MONGO_CONF}://${process.env.MONGO_USER}:${process.env.MONGO_PASS}@${process.env.MONGO_HOST}/${process.env.MONGO_BBDD}`
)
]
})
export class AppModule { }
De esta manera, habrás realizado la conexión de tu base de datos a través de Mongoose, en lugar de utilizar el driver oficial.
Contribución creada por: Kevin Fiorentino.
npm install --save @nestjs/mongoose mongoose
// src/database/database.module.ts
import { MongooseModule } from '@nestjs/mongoose'; // 👈 Import
@Global()
@Module({
imports: [ // 👈
MongooseModule.forRootAsync({ // 👈 Implement Module
useFactory: (configService: ConfigType<typeof config>) => {
const {
connection,
user,
password,
host,
port,
dbName,
} = configService.mongo;
return {
uri: `${connection}://${host}:${port}`,
user,
pass: password,
dbName,
};
},
inject: [config.KEY],
}),
],
providers: [
{
provide: 'API_KEY',
inject: [config.KEY],
},
],
exports: ['API_KEY', 'MONGO', MongooseModule], // 👈 add in exports
})
export class DatabaseModule {}
Se me presento un error el cual era:
TypeError: rxjs_1.lastValueFrom is not a function
la solucion para esto, fue cambiar la version de rxjs
npm i rxjs@^7
No olviden pasar como opciones useUnifiedTopology al cliente de mongo.
const client = new MongoClient(uri, { useUnifiedTopology: true });
Si tienen un error tras importar MongooseModule:
import { MongooseModule } from'@nestjs/mongoose';
Les recomiendo ir al package.json y cambiar la versión de mongodb a:
"mongodb": "^3.6.4",
Luego tienen que borrar la carpeta de mongodb en /node_modules y correr en la terminal el comando:
npm i
Parece ser un error entre esas dependencias, pero eso soluciona el problema.
yo lo hice la forma que dice la documentacion al usar mongoose,
Primero creando un provider dentro de la carpeta providers crean su archivo database.provider.ts
import * as mongoose from 'mongoose'
export const databaseProviders = [
{
provide: 'DATABASE_CONNECTION',
useFactory: (): Promise<typeof mongoose> =>
mongoose.connect(`url a tu db`)
}
]
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.provider';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
Y listo, con eso ya pueden injectar el servicio DATABASE_CONNECTION para tomar la conexion
Advertencia en la sección Código de ejemplo a la función que se le asigna a use factory le hace falta el async
Se me presenta un error en node_modules aparentemente en la carpeta de mongodb y ocurre tan pronto como hago la importación de MongooseModule en database.module.ts
Y quito la importación y todo corre como debería
Alguien sabe por qué pasa esto y cómo solucionarlo?
Mi package.json:
{
"name": "platzi-store",
"version": "0.0.1",
"description": "",
"author": "",
"private": true,
"license": "UNLICENSED",
"scripts": {
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json"
},
"dependencies": {
"@nestjs/common": "^7.6.13",
"@nestjs/config": "^0.6.3",
"@nestjs/core": "^7.6.13",
"@nestjs/mapped-types": "^0.3.0",
"@nestjs/mongoose": "^8.0.0",
"@nestjs/platform-express": "^7.6.13",
"@nestjs/swagger": "^4.7.16",
"class-transformer": "^0.4.0",
"class-validator": "^0.13.1",
"joi": "^17.4.0",
"mongodb": "^4.0.0",
"mongoose": "^5.13.2",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^6.6.6",
"swagger-ui-express": "^4.1.6"
},
"devDependencies": {
"@nestjs/cli": "^7.5.6",
"@nestjs/schematics": "^7.2.7",
"@nestjs/testing": "^7.6.13",
"@types/express": "^4.17.11",
"@types/jest": "^26.0.20",
"@types/mongodb": "^3.6.20",
"@types/node": "^14.14.31",
"@types/supertest": "^2.0.10",
"@typescript-eslint/eslint-plugin": "^4.15.2",
"@typescript-eslint/parser": "^4.15.2",
"eslint": "^7.20.0",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-prettier": "^3.3.1",
"jest": "^26.6.3",
"prettier": "^2.2.1",
"supertest": "^6.1.3",
"ts-jest": "^26.5.2",
"ts-loader": "^8.0.17",
"ts-node": "^9.1.1",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.1.5"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
},
"engines": {
"node": "14.x"
}
}
El curso es muy bueno, seria excelente que lo actualizaran. Para instalar el modulo de mongoose utilicen
npm install --save @nestjs/mongoose mongoose --legacy-peer-deps
En nuevas versiones de mongoose ya sólo necesitarías hacer algo como esto:
npm install --save mongoose
// database.module.ts
import { Module, Global } from '@nestjs/common';
import { ConfigType } from '@nestjs/config';
import mongoose from 'mongoose';
import config from 'src/config';
const API_KEY = '123456789';
const API_KEY_PROD = 'PROD123';
@Global()
@Module({
providers: [
{
provide: 'API_KEY',
useValue: process.env.NODE_ENV === 'prod' ? API_KEY_PROD : API_KEY,
},
{
provide: 'MONGO',
useFactory: async (configService: ConfigType<typeof config>) => {
const { dbUri, dbName } = configService.mongo;
await mongoose.connect(dbUri, {
dbName,
});
return mongoose.connection.db;
},
inject: [config.KEY],
},
],
exports: ['API_KEY', 'MONGO'],
})
export class DatabaseModule {}
Tengo problemas con la instalacion de mongoose, me sale el siguiente error 
¿Alguien sabe que es y como solucionarlo?
esto es para mongoose
imports: [
MongooseModule.forRootAsync({
useFactory: ( configService: ConfigType<typeof config> ) => {
const {
dbName,
user,
password : pass,
port,
host,
connection
} = configService.mongo;
return { uri: `${connection}://${host}:${port}`, user, pass, dbName };
},
inject: [config.KEY]
})
],
y asi para mongo
{
provide: 'MONGO',
useFactory: async ( configService: ConfigType<typeof config> ) => {
const {
dbName,
user,
password,
port,
host,
connection
} = configService.mongo;
const uri = `${ connection }://${ user }:${ password }@${ host }:${ port }/?authSource=admin&readPreference=primary`;
const client = new MongoClient( uri );
await client.connect();
const database = client.db( dbName )
return database;
},
inject: [config.KEY]
},
],
exports: [ 'API_KEY', 'MONGO', MongooseModule ],
mi config esta de esta manera =>
mongo: {
dbName: process.env.MONGO_DB,
user: process.env.MONGO_USER,
password: process.env.MONGO_PASSWORD,
port: process.env.MONGO_PORT,
host: process.env.MONGO_HOST,
connection: process.env.MONGO_CONNECTION
},
psdt: ya validé todos mis .env, quisiera saber que es lo que me hace falta.