2 votes

MongooseError - La mise en mémoire tampon des opérations a expiré après 10000ms

J'ai le code suivant pour le modèle.

import { DatabaseServer } from './database-server';
import { ProjectGroup } from './project-group';
import { ProjectUser } from './project-user';
import { prop, getModelForClass, ReturnModelType, modelOptions } from '@typegoose/typegoose';
import { defaultTransform, ModelBase } from '../general/model-base';
import { ObjectID } from 'mongodb';
import { Connection } from 'mongoose';
import { BeAnObject } from '@typegoose/typegoose/lib/types';

export class Datasource extends ModelBase {

  @prop()
  databaseServer?: DatabaseServer;
  @prop()
  databaseServerId?: ObjectID;
  @prop()
  datasource?: Datasource[];

  @prop()
  name?: string;
  @prop()
  projectGroups?: ProjectGroup[];
  @prop()
  projectUsers?: ProjectUser[];

}

const DatasourceModel = (
  connection: Connection,
): ReturnModelType<typeof Datasource, BeAnObject> => {
  return getModelForClass(Datasource, {
    ...defaultTransform,
    ...{
      existingConnection: connection,
    },
  });

};
export { DatasourceModel };

Et j'utilise le modèle ci-dessus comme suit.

await DatasourceModel(await this.masterContext).find({})

Où le contexte principal est défini comme suit.

import {
  Connection,
  createConnection
} from 'mongoose';

export class MasterContext {
  get context(): Promise<Connection> {
    if (!this.m_context) {
      this.m_context = createConnection('mongodb://localhost/Master', {
        useNewUrlParser: true,
        useUnifiedTopology: true,
      });
    }

    return this.m_context;
  }
  private m_context: Promise<Connection>;
}

Je reçois l'erreur suivante.

Operation datasources.find() buffering timed out after 10000m

Si je change le nom de la classe de export class Datasource à tout autre nom (par exemple export class Datumsource ), alors l'erreur ne se produit pas.

Alors, c'est Datasource mot-clé réservé dans MongoDb ou Mongoose ou Typegoose ?

1voto

hasezoey Points 545

D'après ce que je sais, cette erreur signifie que la connexion n'est pas établie, donc la commande ( find ) a un délai d'attente

Je recommande également de mettre en cache le DatasourceModel ou n'exécuter la fonction qu'une seule fois (la connexion n'a pas besoin d'être connectée pour créer un modèle, elle n'a besoin d'être connectée que pour effectuer des commandes (comme find ))
donc si vous avez une connexion globale, vous devriez simplement supprimer la fonction et simplement exécuter getModelForClass Mais si vous disposez d'une connexion "locale" (comme une propriété de classe), vous devez la mettre en cache à cet endroit, par exemple :

// i think this way of defining stuff is common in nestjs?
class Dummy {
  public connection: mongoose.Connection;
  public model: mongoose.Model;

  constructor(connection: mongoose.Connection) {
    this.connection = connection;
    this.model = getModelForClass({ ...otherGlobalStuff, existingConnection: connection });
    // or when wanting to use your function
    this.model = DatasourceModel(connection);
  }
}

// and if for one file only
let model = DatasourceModel(connection);

Quelques autres notes :

  • si vous voulez utiliser des tableaux dans typegoose, vous devez définir manuellement le type avec la balise type option, regardez ici pourquoi
  • seulement le mongoose.Types.ObjectId doit être utilisé pour un ObjectId

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X