Қоңырауды mongoose үлгісіне бірнеше рет енгізу қажет

Менде mongoose үлгісі бар, келесідей:

user.js

module.exports = function() {
  var mongoose = require('mongoose');

 //Creates a new Mongoose Schema object
  var Schema = mongoose.Schema; 

 //Collection to hold users
  var UserSchema = new Schema({
      username: { type: String, required: true },
      password: { type: String, required: true },
    },{ 
      versionKey: false 
    }
  );

 //Creates the Model for the User Schema
  var User = mongoose.model('User', UserSchema);

  var getUserById = function(id, callback) {
    User.findById(id, callback);
  }

  var getUserByUsername = function(username, callback) {
    var query = {username: username};
    User.findOne(query, callback);
  }


  return {
    getUserById: getUserById,
    getUserByUsername: getUserByUsername
  }
}()

Негізінде Мен пайдаланушы үлгісінің клиенттері қолданатын жалпыға ортақ интерфейсті қайтарамын. И.Е. пайдаланушыларға арналған жолдарым модельді басып шығарады және анықталған екі мемлекеттік әдіске қоңырау шала алады. Мен өзімнің жолдарымнан mongodb/mongoose-ды қолданатын фактіні түсіндіру үшін мұны жасаймын. Мен, ең алдымен, почта жөнелтілімдерімен сөйлесуге болатын немесе пайдаланушыдан кейінгі есептерге көшуі мүмкін пайдаланушы моделі болар. Осылайша, маршруттардағы орындарға арналған кодты қарауға келмейді, сол себептен mongoose-дың арнайы функциялары деп аталады.

Міне, менің мәселе. Модульге қажет болған кезде кодтың барлық жерінде қоңырау шаладым

var someUtil = require('./someUtil');

Алайда, егер мен мұны бір рет-жиі жасайтын болсам, оны екі рет анықтай алмайтынымды білдіремін.

var User = require('./user'); //Cannot put this in more than one file without getting an error.

User.js файлын кодтаудың жақсы тәсілі бар ма, сонда мен Пайдаланушы үлгісіне жалпыға ортақ интерфейс бере аламын, бірақ тек осы файлда бірнеше рет қоңырау шалуы үшін схеманы бір рет анықтай аламын?

1
AFAIK торабы модульді қажет ететін нәтижені кэштейді, сондықтан жоғарыда аталған функция екі рет орындалмауы керек. Бұдан басқа, өзіңізді орындауға арналған функцияда сізді кодтауға ешқандай себеп жоқ, тек export.getUserById = getUserById сияқты әдістерді ашыңыз;//және т.б. .
қосылды автор Andreas Hultgren, көзі
AFAIK торабы модульді қажет ететін нәтижені кэштейді, сондықтан жоғарыда аталған функция екі рет орындалмауы керек. Бұдан басқа, өзіңізді орындауға арналған функцияда сізді кодтауға ешқандай себеп жоқ, тек export.getUserById = getUserById сияқты әдістерді ашыңыз;//және т.б. .
қосылды автор Andreas Hultgren, көзі

9 жауаптар

Mongoose үлгісін сіз оны орап алған қызметтен бөліп алуыңыз керек.

Мен сізге үлгілері бар қалтаны ұсынамын, әр схема бойынша файл бар, әр файл келесідей көрінеді:

'use strict';

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

var User = new Schema({
    ...fields your schema will have
})

//additional virtuals or configuration

module.exports = mongoose.model('User', User)

содан кейін осы үлгі талап ететін UserService бар қызметтер қалтасы бар:

var User = require('../models/User')

function UserService(){
    //create User, delete User, etc.
}

module.exports = new UserService()

содан кейін сіздің контроллеріңізде немесе маршруттарда тек UserService қажет. Сізде осындай проблемалар болмайды және сіздің кодыңыз жақсы ұйымдастырылған.

3
қосылды

Mongoose үлгісін сіз оны орап алған қызметтен бөліп алуыңыз керек.

Мен сізге үлгілері бар қалтаны ұсынамын, әр схема бойынша файл бар, әр файл келесідей көрінеді:

'use strict';

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

var User = new Schema({
    ...fields your schema will have
})

//additional virtuals or configuration

module.exports = mongoose.model('User', User)

содан кейін осы үлгі талап ететін UserService бар қызметтер қалтасы бар:

var User = require('../models/User')

function UserService(){
    //create User, delete User, etc.
}

module.exports = new UserService()

содан кейін сіздің контроллеріңізде немесе маршруттарда тек UserService қажет. Сізде осындай проблемалар болмайды және сіздің кодыңыз жақсы ұйымдастырылған.

3
қосылды

Андреас дұрыс:

AFAIK node caches the result of requireing a module, and thus the above function should not be run twice. Other than that there's no reason to wrap you code in a self-executing function, just expose the methods like exports.getUserById = getUserById; //etc.
0
қосылды

Андреас дұрыс:

AFAIK node caches the result of requireing a module, and thus the above function should not be run twice. Other than that there's no reason to wrap you code in a self-executing function, just expose the methods like exports.getUserById = getUserById; //etc.
0
қосылды

Мен бұл мәселемен айналыстым және менің жауапты беруге болатынын ойладым. Менің мәселем сәл күрделене түседі, себебі менің схемаларымда 'ref' анықтамалары бар. Мен «неге» төменгі жағына дейін жете қойған жоқпын, бірақ негізінен бұл нәрсе тәуелділік тізбегінің бірдей файлды екі рет талап ететінін тудырады. Бұл тексеріледі, өйткені console.log шығуын екі рет аламын. Менің бұрынғы әдісім үлгілердің орнына схемаларды экспорттау болды, бірақ бұл тітіркендірді, себебі барлық модельдерді орындаудың басында бастау керек болды. Кейбір дәмдеуіштерден кейін мен осы парадигмаға қондым (кофе индексін қолдана отырып):

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
қосылды

Мен бұл мәселемен айналыстым және менің жауапты беруге болатынын ойладым. Менің мәселем сәл күрделене түседі, себебі менің схемаларымда 'ref' анықтамалары бар. Мен «неге» төменгі жағына дейін жете қойған жоқпын, бірақ негізінен бұл нәрсе тәуелділік тізбегінің бірдей файлды екі рет талап ететінін тудырады. Бұл тексеріледі, өйткені console.log шығуын екі рет аламын. Менің бұрынғы әдісім үлгілердің орнына схемаларды экспорттау болды, бірақ бұл тітіркендірді, себебі барлық модельдерді орындаудың басында бастау керек болды. Кейбір дәмдеуіштерден кейін мен осы парадигмаға қондым (кофе индексін қолдана отырып):

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
қосылды

Мен бұл мәселемен айналыстым және менің жауапты беруге болатынын ойладым. Менің мәселем сәл күрделене түседі, себебі менің схемаларымда 'ref' анықтамалары бар. Мен «неге» төменгі жағына дейін жете қойған жоқпын, бірақ негізінен бұл нәрсе тәуелділік тізбегінің бірдей файлды екі рет талап ететінін тудырады. Бұл тексеріледі, өйткені console.log шығуын екі рет аламын. Менің бұрынғы әдісім үлгілердің орнына схемаларды экспорттау болды, бірақ бұл тітіркендірді, себебі барлық модельдерді орындаудың басында бастау керек болды. Кейбір дәмдеуіштерден кейін мен осы парадигмаға қондым (кофе индексін қолдана отырып):

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
қосылды

Мен осы мәселеге де қатыстым.

Сіз жасай алатын нәрсе схема анықтамасын көріңіз

Осы жолды ауыстырыңыз var User = mongoose.model ('Пайдаланушы', UserSchema); :

var User;
try {
  User = mongoose.model('User', UserSchema);
}
catch(e) {
  User = mongoose.model('User');
}

Оның ең жақсы тәсілі, бірақ ол жұмыс істейтініне сенімді емес.

0
қосылды

Мен осы мәселеге де қатыстым.

Сіз жасай алатын нәрсе схема анықтамасын көріңіз

Осы жолды ауыстырыңыз var User = mongoose.model ('Пайдаланушы', UserSchema); :

var User;
try {
  User = mongoose.model('User', UserSchema);
}
catch(e) {
  User = mongoose.model('User');
}

Оның ең жақсы тәсілі, бірақ ол жұмыс істейтініне сенімді емес.

0
қосылды