Estoy buscando un ejemplo de aplicación nodejs que utiliza el ORM de secuencia.
Mi principal preocupación es que parece casi imposible definir sus modelos en archivos js separados si esos modelos tienen relaciones complejas entre sí debido a los bucles de dependencia require (). ¿Quizás las personas definen todos sus modelos en un archivo que es muy, muy largo?
Estoy interesado principalmente en cómo se definen y usan los modelos a través de la aplicación. Me gustaría tener alguna validación de que lo que estoy haciendo por mi cuenta es la forma "buena" de hacer las cosas.
node.js
express
sequelize.js
mkoryak
fuente
fuente
Respuestas:
La historia corta
El truco en este caso no es inicializar el modelo en el archivo, sino simplemente proporcionar la información necesaria para su inicialización y dejar que un módulo centralizado se encargue de la configuración e instanciación de los modelos.
Entonces los pasos son:
require
en sus archivos de modelo, cargue los modelos desde el singleton.La historia mas larga
Aquí hay una descripción más detallada de esta solución con el código fuente correspondiente:
http://jeydotc.github.io/blog/2012/10/30/EXPRESS-WITH-SEQUELIZE.html
EDITAR: ¡Esta es una respuesta muy antigua! (lea abajo para obtener información)
¡Es viejo y limitado de muchas maneras!
Primero , como @jinglesthula mencionó en los comentarios (y también lo experimenté), hay problemas al requerir esos archivos. ¡Es porque
require
no funciona de la misma manera quereaddirSync
!En segundo lugar , está muy limitado en las relaciones: el código no proporciona opciones a esas asociaciones, por lo que no puede crearlo
belongsToMany
ya que necesitathrough
propiedad. Puedes hacer las asociaciones más básicas.Tercero : ¡eres muy limitado en las relaciones modelo! Si lee detenidamente el código, verá que las relaciones son un Objeto en lugar de una Matriz , por lo que si desea hacer más de una asociación del mismo tipo (como tener dos veces
belongsTo
), ¡no puede!Cuarto : no necesitas esa cosita singleton. Cada módulo en nodejs es singleton en sí mismo, por lo que todo esto es bastante complejo sin ninguna razón.
¡Deberías ver la respuesta de Farm! (El enlace al artículo está roto, pero lo arreglaré con esta muestra oficial de la secuencia: https://github.com/sequelize/express-example/blob/master/models/index.js ; puede navegar por el proyecto completo para tener una idea de lo que está pasando).
PD: Estoy editando esta publicación porque está tan votada que la gente ni siquiera verá nuevas respuestas (como yo lo hice).
Editar: solo cambié el enlace a una copia de la misma publicación, pero en una página de Github
fuente
require
módulos d en el nodo eran en cierto sentido simples porque el código en ellos se ejecuta una vez y luego se almacena en caché, por lo que la próxima vez que los necesite obtendrá una referencia de objeto en caché. ¿No es esta la imagen completa?SequelizeJS tiene un artículo en su sitio web que resuelve este problema.
El enlace está roto, pero puede encontrar el proyecto de muestra de trabajo aquí y navegarlo. Vea la respuesta editada arriba para ver por qué esta es una mejor solución.
Extracto del artículo:
models / index.js
La idea de este archivo es configurar una conexión a la base de datos y recopilar todas las definiciones del Modelo. Una vez que todo esté en su lugar, llamaremos al método asociado en cada uno de los Modelos. Este método se puede utilizar para asociar el modelo con otros.
fuente
sequelize
variable en su archivo de modelo, puede acceder a su otro modelo consequelize.models.modelName
.Creé un paquete sequelize-connect para ayudar a las personas a lidiar con este problema. Sigue la convención sugerida de Sequelize aquí: http://sequelize.readthedocs.org/en/1.7.0/articles/express/
Además, también funciona un poco más como Mongoose en términos de su interfaz. Le permite especificar un conjunto de ubicaciones donde se encuentran sus modelos y también le permite definir una función de coincidencia personalizada para que coincida con sus archivos de modelo.
El uso es básicamente así:
Luego puede acceder a los modelos y secuenciar así:
Esperemos que esto ayude a alguien.
fuente
Empecé a usar Sequelize en la aplicación Express.js. Muy pronto se toparon con problemas de la naturaleza que estás describiendo. Tal vez no entendí bien Sequelize, pero para mí hacer cosas más que simplemente seleccionar de una tabla no era realmente conveniente. Y donde normalmente usaría select de dos o más tablas, o una unión en SQL puro, tendría que ejecutar consultas separadas, y con la naturaleza asíncrona de Node es solo complejidad añadida.
Por lo tanto, me alejé de usar Sequelize. Además, estoy cambiando de usar CUALQUIER búsqueda de datos de DB en los modelos. En mi opinión, es mejor abstraer la obtención de datos por completo. Y las razones son: imagine que no solo usa MySQL (en mi caso, uso MySQL y MongoDB lado a lado), sino que puede obtener sus datos de cualquier proveedor de datos y cualquier método de transporte, por ejemplo, SQL, no-SQL, sistema de archivos, API externa, FTP, SSH, etc. Si intentara hacerlo todo en los modelos, eventualmente crearía un código complejo y difícil de entender que sería difícil de actualizar y depurar.
Ahora lo que quiere hacer es tener modelos de obtener datos de una capa que se sabe dónde y cómo conseguirlo, pero sus modelos utilizar métodos de la API, por ejemplo
fetch
,save
,delete
etc. Y dentro de esta capa que tienen implementaciones específicas para los proveedores de datos específicos. Por ejemplo, puede solicitar ciertos datos de un archivo PHP en una máquina local o de la API de Facebook o de Amazon AWS o de un documento HTML remoto, etc.PS algunas de estas ideas se tomó de Arquitecto por Cloud9 : http://events.yandex.ru/talks/300/
fuente
fetch
,save
,delete
etc. fuera delSequelize
dado que el marco ya proporciona los medios. Es mejor, pero menos conveniente tener una capa de recuperación separada. Al mismo tiempo, probablemente podría agregar una capa de abstracción para buscar alrededor de Sequelize, pero luego la solución es más complicada, para una victoria discutible.Lo configuré como Granja y la documentación lo describe.
Pero estaba teniendo el problema adicional de que en mis métodos de instancia y métodos de clase que asociaría a los modelos en cada función, necesitaría requerir el archivo de índice para obtener otros objetos de la base de datos.
Lo resolvió haciéndolos accesibles a todos los modelos.
Y en el archivo del modelo
Solo hice esto para los métodos de clase, pero también podría hacer lo mismo para los métodos de ejemplo.
fuente
Estoy siguiendo la guía oficial: http://sequelizejs.com/heroku , que tiene una carpeta de modelos, configura cada módulo en archivos separados y tiene un archivo de índice para importarlos y establecer la relación entre ellos.
fuente
Secuencia de modelo de muestra
fuente
Puede importar modelos de otros archivos con
sequelize.import
http://sequelizejs.com/documentation#models-importDe esa manera, puede tener un módulo singleton para la secuencia, que luego carga todos los demás modelos.
En realidad, esta respuesta es bastante similar a la respuesta del usuario 1778770.
fuente
Tal vez le interese buscar la solución estándar PEAN.JS.
El proyecto PEAN es una bifurcación del proyecto MEAN.JS (no debe confundirse con MEAN.IO o la pila genérica MEAN).
PEAN reemplaza MongoDB y Mongoose ORM con PostgreSQL y Sequelize. Un beneficio principal del proyecto MEAN.JS es la organización que proporciona a una pila que tiene muchas piezas móviles.
fuente
También puede usar una inyección de dependencia que proporciona una solución elegante para esto. Aquí hay uno https://github.com/justmoon/reduct
fuente