Mongoose: Autoriser `importer { modèle } de mangouste`

Créé le 16 janv. 2016  ·  14Commentaires  ·  Source: Automattic/mongoose

C'est courant lorsque l'utilisateur veut importer des variables du module sans enregistrer le module dans une variable, par exemple

let {Schema} = require('mongoose');

ou

var Schema = require('mongoose').Schema;

mais quand je fais ça avec le modèle

var model = require('mongoose').model;

et essayez de créer un modèle avec une fonction importée, j'ai une erreur

TypeError: Cannot read property 'modelSchemas' of undefined

Oui, model est une propriété de Mongoose.prototype, mais Schema l'est aussi.
Si la documentation contient une instruction comme

var Schema = mongoose.Schema,
...

il est possible de supposer que « modèle » aura un comportement similaire

enhancement

Commentaire le plus utile

+1

Actuellement cela ne fonctionne pas :

import { model } from 'mongoose'

Tous les 14 commentaires

Soutenir ce comportement impliquerait un refactoring massif des connexions de mangouste. Pour faire court, require('mongoose').model(); est différent de var model = require('mongoose').model; model(); car la valeur de this dans l'ancien appel de fonction est le singleton require('mongoose'); , alors qu'il s'agit de l'objet global dans ce dernier appel. Si vous voulez une solution de contournement, model.call(require('mongoose'), 'MyModelName', schema); devrait fonctionner correctement. Je ne suis pas un grand fan du fait que les fonctions de haut niveau de la mangouste sont chargées d'effets secondaires, mais pour nous en débarrasser, nous devrions également nous débarrasser de la syntaxe mongoose.model() getter, qui casserait un beaucoup de code de personnes.

@vkarpov15 merci pour ta réponse !

Il y a 2 cas différents :

  1. Nous savons que c'est un bogue, mais le corriger prend du temps pour le refactoring. Ensuite, nous devrions garder le problème ouvert
  2. Nous affirmons que ce n'est pas un bug. Ensuite, nous devrions fermer le problème

Lorsque le problème est ouvert, il peut être résolu avec une modification de rupture (dans une nouvelle version majeure) ou sans modification de rupture (vous savez, tout peut être remanié avec une compatibilité descendante, cela dépend uniquement de l'effort). Quelqu'un (par exemple moi) a probablement le temps pour cela.

Mais lorsque nous marquons le problème comme clos, nous informons les contributeurs que les demandes d'extraction avec correction de ce bogue seront rejetées et que quelqu'un ne commence même pas à le corriger.

Qu'est-ce que tu en penses?

Bon point, je vais garder ce problème ouvert. La solution de contournement est simple, assurez-vous simplement que les fonctions ont un contexte approprié. La solution éventuelle est l'absence d'effets secondaires.

+1

Actuellement cela ne fonctionne pas :

import { model } from 'mongoose'

Ne devrait pas fonctionner dans un avenir immédiat en raison des effets secondaires chez la mangouste. Pas vraiment un bon moyen de faire fonctionner mongoose.model() comme getter/setter si vous utilisez import { model } moins que vous n'utilisiez l'état global, ce que je déteste faire. Pourquoi n'utilisez-vous pas simplement import 'mongoose'; ? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

Je vais +1 ceci.

import { model } from 'mongoose'

^ est une syntaxe pratique/attrayante.

J'ai créé #3943 comme solution rapide pour cela. Si c'est acceptable (jusqu'à ce qu'une meilleure solution puisse être créée), alors je peux écrire un test pour accompagner le PR. S'il a besoin d'être révisé, je suis plus que disposé à le faire.

J'aime l'idée générale, mais les tests échouent dans ce pr, ce qui est malheureusement un briseur d'affaire

Ouais, j'ai vu ça. je vais jouer avec demain pour voir ce qui se passe
au.

Le samedi 5 mars 2016, 17:45 Valeri Karpov [email protected] a écrit :

J'aime l'idée générale, mais les tests échouent dans ce pr, ce qui est une affaire
disjoncteur malheureusement

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/Automattic/mongoose/issues/3768#issuecomment -192769531
.

Je suis tombé sur cela aujourd'hui après avoir essayé const { model } = require('mongoose');

inutile de dire que cela n'a pas fonctionné alors revenez à let foo = mongoose.model('foo',fooSchema);

Soyez gentil si quelqu'un a le temps pour une solution, mais je peux voir pourquoi ce n'est pas une priorité élevée !

Donc, pour essayer de clarifier, en cours d'exécution

import { model } from 'mongoose';
//...
model('testModel', testModelSchema);

... expose l'objet model à l'espace de noms global, alors que

import mongoose from 'mongoose';
//...
mongoose.model('testModel', testModelSchema);

place le modèle dans la portée de l'objet singleton mangouste déjà connecté. Certains peuvent-ils me confirmer cela s'il vous plaît.
Merci

@cr05s19xx qui est généralement correct. Dans le premier, this est l'espace de noms global, mais dans le dernier this dans model() fait référence au singleton mangouste

Si cette erreur ne se produit que lorsque nous avons ce problème, il serait avantageux d'imprimer la cause et de la corriger afin que les gens n'aient pas à chercher sur Google et à aborder ce problème comme je l'ai fait.

En 5.3.14, vous pourrez faire import {model} from 'mongoose' et cela fonctionnera correctement. C'est juste pour cette fonction, nous avons encore besoin de plus de travail pour prendre en charge cela pour le reste de l' API globale Mongoose . Nous mettrons toujours en garde contre cela et conserverons la section dans la FAQ , mais le cas du modèle est si fréquent que nous pouvons le corriger de manière ponctuelle.

Cette page vous a été utile?
0 / 5 - 0 notes