>> Donc, cela étant dit,
juste une sorte de simple introduction des prototypes
et le modèle d'objet JavaScript.
Nous n'allons pas changer engrenages un peu à parler
sur plus JavaScript sur l' serveur et la bibliothèque Bibliothèque
et la connexion Knex Bibliothèque.
Ainsi, vous pouvez en fait juste -
si vous recherchez Bookshelf.js il devrait être assez facile
à trouver, devrait être le premier résultat, et Bookshelf
David mentionné juste donne beaucoup de la structure
autour des objets JavaScript et travailler avec eux sur le plan relationnel
dans les bases de données relationnelles.
Donc, beaucoup de caractéristiques similaires qui est en réalité fortement inspiré
par l'ORM de Laravel comme ainsi que la Backbone.js,
qui est une extrémité avant MVC bibliothèque qui vous permet
de structurer votre code, semblable à ce que je montrais
avec les exemples de l' prototypes où vous pouvez -
au lieu de simplement arbitrairement jeter des classes
votre point de vue ici et là.
Il vous donne des modèles et collections de ces modèles
qui sont censés agir comme une sorte de point de vérité unique
sur les données pour votre application.
Et puis vous écoutez, que ceux modèles changements, vous disent, OK,
re-rendre ce modèle ici et celui-ci ici
et pas seulement ajouter la classe ici, ajouter la classe et il sorte de prendre
sur les sélecteurs et faire la toile d'araignée de jQuery.
Il donne plus de base de classe une Structure de pièces individuelles,
mais un élément important de que les modèles de la bibliothèque est
qui ont une structure semblable à ce que les modèles d'étagère font.
Donc, si vous êtes familier avec le Étagère vous êtes assez également
assez familier avec Backbone.js modèles,
et je vous recommande jeter un oeil à ce.
Ainsi, certaines des principales caractéristiques
qu'il donne vous êtes juste la possibilité de définir des données sur un objet
appeler chercher, qui retourne un enregistrement individuel
de la base de données, créer des relations comme similaires
à ce que vous recevez dans dans Laravel
où vous pouvez dire un Patient une méthode d'enregistrement
et dire que a gagné fiche
où l'objet de l'enregistrement est dossiers de santé de noms de table.
Voyons.
A beaucoup - il appartient à -
juste des trucs que vous êtes assez similaire -
assez familier avec déjà, mais en JavaScript.
Et sous le capot, pour Bookshelf,
il utilise un générateur de requêtes appelé Knex.js.
Donc, c'est Knex, knexjs.org.
C'est une référence au jouet si quiconque a jamais joué avec cela.
Mais il vous permet - dans un De façon similaire, pour jQuery,
vous venez de créer une sorte de chaîne de différentes méthodes
que vous appelez votre base de données ligne afin que vous puissiez -
vous avez commencé par dire Knex et le nom de la table.
Ainsi, par exemple, les utilisateurs KNEX, sélectionnez les colonnes que vous souhaitez,
où, et avoir, s'il est différent conditionnelles et vous pouvez avoir
ET si, ou lorsque, où entre les deux, où pas,
vous maintenant, sur toute la ligne.
Vous pouvez spécifier différentes jointures entre vos tables de base de données
Bibliothèque qui utilise en interne de mettre en place sorte de magie
autour de la hasOne, hasMany, belongsTo, belongsToMany.
Et si la combinaison
des deux vous permettent de faire à peu beaucoup ce que vous souhaitez être utilisé
au cadre comme Laravel en termes
de fonctionnalité travailler avec des bases de données.
Donc, nous allons aller de l'avant et prendre un coup d'oeil à un exemple simple
pour une application Express, qui rend l'utilisation de ces modèles
et des collections de Bibliothèque jazz [transcription phonétique].
Alors, j'ai mis en place seulement simple application ici.
J'ai dépouillé sur certains trucs qui a été en cours d'initialisation express
et se déplacer que dans une initialisation répertoire que j'ai créé.
Une des belles choses sur travailler avec Express supposée
à Laravel c'est qu'il ya vraiment pas beaucoup forcée
sur vous conventionalized.
Ainsi, vous pouvez créer des répertoires -
il ne pas vraiment vous donner un tas de travailler hors de.
Vous avez en quelque sorte d'une certaine réglages de base et puis -
mais il ne se soucie pas où vous les mettez.
Vous n'avez pas à avoir le répertoire de contrôleur.
Vous n'avez pas besoin d'avoir un des modèles répertoire, un répertoire config.
Vous pouvez sorte de créer ceux que vos besoins du projet
et mettre les choses la voie qui font sens le plus pour vous.
Ainsi, au lieu d'avoir tous ce passe-partout express
dans les principales app.js je viens de dire app égaux exigent INIT / express.
Et si dans l'init,
le dossier d'initialisation J'ai juste Exprimez ici,
et cela nécessite Express, appels la fonction de configuration, appelle la -
met en place le moteur de vue, JSON parser, tout ça.
Alors maintenant, nous allons continuer vers le bas.
Donc, je suis exigeant l' réunion cours d'instructeur
et les exigences des modèles.
Ce sont donc dans un dossier J'ai décidé de modèles de noms.
Il n'a pas besoin d'être que moyen mais il est logique,
mais les modèles sont juste assez commun et je voudrais donc recommander.
Mais - Allons donc pour le cours.
Je pense que je suis en utilisant - ouais, et les exemples
ici sont tous basés autour du modèle de cours.
Donc, nous allons juste prendre un coup d'oeil à ce.
Donc, maintenant, juste de l' première ligne de ce modèle,
Je suis déjà exigeant autre chose.
Donc, si vous remarquerez dans le noeud vous devez être exigeant
ou vous allez finir par nécessitant tout un tas
de fichiers différents qui sont situés
dans des lieux différents dans votre application.
Et les chemins relatifs où que vous soyez
dans votre application en cours,
sauf s'il s'agit d'un haut niveau déjà tels que définis dans l'installer
avec MPM comme bibliothèque ou Knex ou Express ou quelque chose,
ce ne sont pas relative.
Oui? Zoom en plus?
OK. OK. Alors, vous allez finir par exiger tout un tas
fichiers d'un peu différentes dans votre code, ce qui est bon et mauvais.
Dans une bonne façon, vous savez où les choses sont et ce n'est pas de tri
de la magie à ce qui est passe sous le capot,
qui peut être vraiment déroutant
quand vous avez un très Java lourde -
ou un cadre très lourd comme Laravel, qui dit en quelque sorte,
nous allons prendre soin de ce que vous n'avez pas
tout d'exiger mais vous avez
à savoir comment tout travaux afin de l'utiliser.
Lorsque, dans ce cas, il est très simple à
où tout est, ils sont seulement extrémités
par être un peu plus à taper.
Tout comme dans la partie que j'aime à utiliser, il ya un plugin
si vous utilisez un texte aveugle
où vous pouvez installer le nœud modules auxiliaires et vous pouvez commencer à
à taper comme instructeur et il crée le chemin relatif
à l'endroit où vous êtes à ce fichier de code, sorte de utile.
Donc, le modèle de parcours est exigeant de base ici
puis stagiaire de base exige init / bibliothèque
puis la bibliothèque, il exige la bibliothèque de haut niveau
et initialise ensuite avec l'instance Knex initialisé,
qui définit le nom du client
et la connexion les paramètres de la base de données.
Donc, je suis juste en utilisant un simple instance de Sequel Pro laquelle -
de MySQL, je suis accéder avec Sequel Pro et il a en quelque sorte
d'une base de données similaire configuration que nous avions
dans le premier exemple d'application avec le catalogue de cours.
Alors, j'ai mis ma connexion réglages ici,
et ceux-ci sont tous documentés sur la page du projet Knex.js
quant à la façon de configurer ces connexions.
Donc, j'ai maintenant mon modèle de base.
Et comme je l'ai mentionné avec le changement du prototype,
de sorte que peut réellement être une sorte de lot de -
ajoute beaucoup de boilerplate à votre code afin convention
qui a été adapté par Backbone.js
et maintenant Bookshelf.js est ajouter cette méthode s'étend
comme une propriété statique sur vos objets JavaScript,
ce qui lui donne une sorte de quasi- héritage nature à base de classe-
où si vous appelez étendre vous pouvez mettre en place
des méthodes de prototype que vous souhaitez ici
et puis vous pouvez - tout méthodes statiques supplémentaires
que vous voudrez peut-être, vous peut tout régler vous-mêmes
ici donc je peux prolonger - alors si, par exemple,
plusieurs modèles nécessaires afficher le nom et ce nom se.
Donc, ici, que je dis la nom d'affichage pour le modèle
par défaut est ce que son nom la propriété est par ailleurs le retour
pas de nom.
Et maintenant sur tous les c'est un modèle -
qui s'étend de ce modèle de base, je ont maintenant une méthode de nom d'affichage
sur le prototype chaîne quelque part.
Et si je veux écraser Je ne peux le mettre - définir ce -
getname serait ici.
Et il vous permet d'imiter héritage classique
dans JavaScript, qui peut être agréable notamment pour des choses
qui sont prêtent étant eux-mêmes classe basée comme modèles d'objet.
Donc, nous allons sauter de nouveau dans le code de l'application.
Donc, j'ai un parcours juste slash, juste pour mon index
puis réduire cours.
Et ces deux appellent la méthode renderCourses.
Encore une fois, les fonctions sont première classe et peut être passé
comme arguments de méthodes.
Donc, dans ce app.get, Je vous appelle -
Je suis de passage renderCourses comme argument.
Et rendre - ou fonctions peut être configuré comme var -
que je faisais auparavant var renderCourses égal fonction
ou ils peuvent être simplement renderCourses de fonction.
Il ne fait pas trop beaucoup de différence.
Vous pouvez en fait avoir ce sont appelés fonction de nom
expressions, qui sont renderCourses var égaux
renderCourses de fonction.
Et, la raison de vouloir avoir nommer des fonctions particulièrement
dans le noeud, c'est qu'il vous donne un nettoyeur -
plus lisible trace de la pile.
Donc si vous avez tout un tas
des fonctions anonymes il va dire -
lorsque vous avez une erreur dans votre code vous en aurez -
vous ne saurez pas quelle fonction qu'il appelle que vous avez à regarder
à ce numéro de code et le numéro de ligne
et il est parfois plus facile juste pour analyser visuellement
quand vous avez réellement noms
pour les fonctions eux-mêmes sur le côté serveur.
Donc, ce renderCourses, appelons applications de noeuds -
donc je suis à l'écoute sur Base 3000 [transcription phonétique].
Et si tout cela est en train de faire ici est juste d'obtenir tous les
cours de la base de données.
Je ne suis même pas limiter il est donc de faire un grand nombre
de lignes, il est de retour.
Et pour ce faire,
sur le modèle de la trajectoire y est une propriété statique
appelé collection.
Et donc je l'appelle - je ledit créer une nouvelle collection
pour ce cours, puis chercher,
puis retourner les cours collection ici dans la promesse.
Donc, à l'intérieur, David - l' dernière moitié enseigné un peu
des promesses et des promesses sont utilisé très largement dans les deux Knex
Bibliothèque et parce il prête le -
il vous le donne possibilité d'avoir un tas
des différents appels asynchrones et une sorte de rejoindre ensuite ensemble
ou chercher quelque chose, puis
avec cet appel une autre appel de base de données asynchrone
et renvoie cette valeur et puis passer à la suivante alors
et à côté alors, et alors avoir un prendre à la fin de trier
de mime essai asynchrone capture comportement avec le code asynchrone,
parce que vous voyez maintenant
mais c'est encore plus difficile une fois vous commencez à traiter avec elle.
Code asynchrone est juste partout
en JavaScript côté serveur et vraiment à un degré beaucoup plus élevé
que vous êtes habitué à si vous avez fait le JavaScript
sur le côté client.
Alors que vraiment, vraiment vous a aidé là-bas.
Mais juste pour vous montrer la déclaration du débogueur
que je parlais dans les outils de l'inspecteur de nœuds,
Je vais aller de l'avant et lancer une ligne de débogueur ici
dans la fonction renderCourses et voir où cela me mène
quand je - si noeud inspecteur peut être installé
en faisant NPM Installer avec un drapeau G,
ce qui signifie mondial Inspecteur de nœud.
Et il va le chercher pour le NMP et l'installer à l'échelle mondiale
pour vos applications de sorte que vous pouvez simplement appeler
à partir de la ligne de commande.
J'ai déjà installé donc je vais aller de l'avant et -
effectivement il pourrait avoir attendre qu'il prendra juste,
prendre deux secondes.
Et ce inspecteur noeud vous permet à nouveau
à faire est encore ce sans tête version de la console de débogage
que vous avez l'habitude de travailler quand sur le côté client et être en mesure
d'arrêter, il suffit d'ajouter spécifiée points dans votre code.
Arrêter l'exécution et de prendre une regarder ce qui se passe,
qui aurait vraiment utile si la fonction
comme cela était disponible
lors du débogage code PHP je suis sûr.
Donc, nous allons juste prendre un coup d'oeil à ce.
Donc, je peux juste appeler inspecteur de noeud
et il dira visiter cette URL le port 5858 pour démarrer le débogage,
ce n'est que le défaut pour savoir comment il démarre.
Donc, j'ai maintenant - il ya rien à faire ici
parce que je dois commencer.
Donc noeud impasse [transcription phonétique] l' debug puis app.js.
Alors il dit débogueur écoute sur le port 5858,
Écoute Server Express en 3000.
Donc, nous sommes prêts à partir.
Permettez-moi de vous rafraîchir la présente.
Et maintenant, je peux voir les app.js code que je regardais
mais ici dans la console.
Alors maintenant, si j'essaie d'exécuter cette commande, vous pouvez le voir, il s'arrête.
Il attend juste parce que son l'exécution de code entier est maintenant
arrêté sur ce débogueur ligne que j'ai mis là-dedans.
Et je peux maintenant serveur -
[Inaudible Remarque]
Oh, ouais. Quel est le mot-clé raccourci pour agrandir l'écran?
Oh il est.
Je l'ai. OK.
[Pause]
Oh, il ne cherche pas [Phonétique] que.
Ainsi, des cours est vraiment grand
parce que je ne fais pas un limiter clause ou quoi que ce soit,
c'est juste la récupération de la base de données entière de cours
qui sont beaucoup d'entre eux.
Et - ce qui est l'objet
qui fait peut planter l'exemple de l'inspecteur de la note.
C'est - OK.
Permettez-moi de faire une limite et alors nous pouvons prendre un coup d'oeil
quand ce n'est pas chercher des centaines de cours.
Donc, tuer le serveur et l'inspecteur
et je ferai bien sûr limite la collecte de la requête 20.
Ainsi, dans Bookshelf, contrairement à Laravel
où vous pouvez simplement appeler limiter directement ou appeler n'importe quel
de ces méthodes SQL que vous utilisez
à directement sur l'instance ORM.
Chaque fois que vous utilisez juste Procédé SQL qui est prévu
dans Knex, vous devez appeler la requête pour trier
de puiser dans la chaîne de requête.
Et cela peut être invoquée avec soit une fonction,
de sorte que vous pouvez dire, la fonction cette limite de 10 ou si vous appelez
en spécifiant laquelle la méthode que vous souhaitez appeler
sur l'instance Knex et puis quelle valeur.
Donc, nous allons faire limiter à 20 puis définissez.
Nous faisons effectivement pas besoin débogueur ici
parce que nous pouvons juste définir des points d'arrêt
et qui le rend plus facile.
Très bien.
Donc, nous allons définir un point d'arrêt ici et essayer de le charger.
Ligne tort.
Juste ici.
[Pause]
OK. Donc, il s'arrêta de nouveau.
Alors maintenant, les cours est une objet une longueur de 20
et nous pouvons voir tous les différents modèles que c'est tiré par les cheveux
de la base de données ici donc j'ai un objet de modèle
qui présente, à l'intérieur de l' attributs propriété
sur l'objet sont toutes les choses qu'il est trouvé dans la base de données.
Tous les événements qui ont été enregistré
de sorte que vous pouvez enregistrer différents événements,
par exemple lorsque l' modèle est supprimé
ou quand il est en cours de récupération,
vous pouvez définir différents propriétés ou de modifier les choses.
Il ya beaucoup de différents crochets et ceux-ci sont tous documentés
dans les Bookshelf.js documentation qui vous permettent
à faire sorte de chose que vous voulez vraiment faire
avec vos modèles et des collections.
Vous pouvez - ils sont destinés pour être vraiment personnalisable
et vraiment simple pour vous de les adapter
pour les besoins de votre application.
Mais simplement en regardant par ici,
Je peux voir ce que l'autre cours sont disponibles.
Et dans ce cas, je effectivement ne pas chercher
avec d'autres données autres que seulement les cours eux-mêmes.
Mais d'une manière similaire à la Eloquent ORM vous pouvez définir
des relations, de sorte que le cours appartient à beaucoup instructeur.
Donc, si je vais de l'avant et arrêter l'application,
sautez à ce chercher appel, vous peut spécifier différentes options
que vous souhaitez transmettre à elle.
Et l'un d'eux est la possibilité de charger code correspondant
en spécifiant withRelated instructeurs alors cours.
Donc revenons et frais ce ici et arrêter de nouveau.
Alors maintenant, les cours objet, même nombre de modèles,
mais maintenant chaque modèle a un hachage des relations
qui a les instructeurs que c'est lié à.
Alors ce cours par exemple
qui est bien sûr 082 a deux modèles d'instructeur connexes.
Et vous pouvez déjà voir comment beaucoup plus facile consiste à trier
de travailler visuellement avec de quand vous avez affaire avec des trucs
que vous sorte de modifier le code et puis essayer de nouveau en PHP.
Le fait que vous ne pouvez arrêter l'exécution entièrement
et d'évaluer ce qui est ici et le - dans la console, le -
zoom arrière, des cours est, vous le savez,
ce que la portée locale variables sont disponibles
et c'est actuellement le mondial objet parce que, comme vous l'avez vu,
sauf si vous appelez d'un contexte spécifique, il ne va pas
d'avoir quelque chose de pertinent ici.
Et puis, le - permettez-moi de montrer quelques exemples
la mise en œuvre des promesses.
Ainsi, au lieu de le faire instructeurs withRelated ici je suis
aller de l'avant et faire avancer ce chercher puis les cours,
Je vais revenir instructeurs de courses.load.
Et puis - alors vous appelez alors.
[Pause]
Alors à ce moment, le cours doivent être chargés
avec les instructeurs, qui est l'action asynchrone.
Mais parce que nous le retourner d'une promesse, la prochaine valeur
car alors est ce que ce retour de l'appel asynchrone
qui dans ce cas la charge est une méthode en bibliothèque
qui renvoie effectivement la collection elle-même.
Il s'agit donc de charger le instructeurs, il
et alors vous pouvez spécifier - si c'est juste une propriété,
vous pouvez le spécifier sous forme de chaîne, sinon,
vous pouvez faire des instructeurs et les exigences
comme une méthode - désolé, comme un tableau.
Et puis si vous souhaitez obtenir vraiment envie et contraindre toute
de ces extractions donné, vous peut spécifier comme une table de hachage
avec les instructeurs et puis ce vous aimez pour limiter la requête sur.
Donc, je voudrais charger tous instructeurs des cours où -
si QB pour générateur de requêtes où le statut est actif.
Et vous pouvez vraiment obtenir de fantaisie avec une
des requêtes connexes vous souhaitez construire.
Mais, juste pour l'instant, nous allons de s'en tenir à quelques instructeurs
et on y retourne cette valeur
oui, alors la prochaine devrait alors ont tous les cours de chargement
correctement.
Et s'il y avait une erreur à n'importe quelle étape de cette chaîne,
il sauter à la capture.
Allons donc de l'avant et exploités que.
Donc, chaque fois - contrairement à PHP, un inconvénient est le
"Parce noeud" est une longue marche processus, vous devez effectivement
pour arrêter le processus de noeud que vous mettez à jour votre code,
parce que la version que c'est s'exécutant dans le temps d'exécution est,
la version de l' code qui était chargé
quand il commence pas ce que vous avez de tri
de mise à jour de votre code avec depuis.
OK. Nous allons mettre un point d'arrêt ici, ici et rafraîchissement.
[Pause]
Oh, en fait je n'ai pas rafraîchir cette page soit
il était sur l'ancien processus.
Donc, vous actualisez la fois ce et l'inspecteur de noeud.
Alors maintenant, nous voyons cours.
Si nous prenons juste l'échantillon de l'un de ces modèles,
nous pouvons voir que les relations objet est vide, mais maintenant -
et la raison pour laquelle vous avez besoin pour définir des points d'arrêt est, ainsi,
J'ai mentionné que vous pouvez sauter dans la trace de pile
et voyez vous le savez, où il va dans l'application.
Alors maintenant, je peux voir ce qui est passe dans la méthode de charge,
qui j'ai défini sur les collections.
Il sorte de "charges Eager relations sur un déjà ".
Et vous pouvez faire défiler et voir ligne par ligne
où cette substance est aller qui est optimal.
Si vous avez quelque chose qui est cassé dans votre code,
c'est jeter une erreur et vous êtes comme, je veux vraiment
pour voir où cela va.
Mais dès que vous avez quelque chose asynchrone, la -
il va à la prochaine tiques de la boucle d'événements
et vous perdrez votre - vous perdez votre place
dans l'inspecteur de noeud.
Donc vous devez dire, "OK, une fois que je perds,
il doit arrêter maintenant à cette ligne de nouveau ".
Parce que si je continuais à frapper vers le bas, en bas de la pile,
il aurait finalement juste Gone Away je n'avais pas mis ce
ligne 22, ligne de rupture bleu.
Alors maintenant, si je regarde au cours ici,
il se doit sur la relation instructeurs
et alors le instructeurs les joindre.
Ainsi, vous pouvez voir que je suis rentré une promesse de la première promesse
et puis vous pouvez toujours faire que sur la ligne.
Ainsi les différents promesse, promettre bibliothèques,
J'ai utilisé un appelé Bluebird ce qui est vraiment utile.
Il ajoute beaucoup de bon de cette pour changer asynchrone -
changer de rappel code de base dans des trucs
qui fonctionne bien avec des promesses.
Mais - désolé [inaudible] ce J'allais dire là.
Jetons un coup d'oeil mais au -
alors disons qu'il y avait une problème lors de la lecture quelque chose.
Donc, j'ai cette autre voie pour trouver appelé ID de cours.
Alors, faisons bien sûr 2.
Puis-je obtenir - bien sûr JSON.
Et cela ne [inaudible].
[Pause]
Je sens quelque chose de mal ici.
Pas sur 3000, j'étais sur l'onglet inspecteur Chrome.
OK. Allons donc à bien sûr - JSON cours 1.
Et cela renvoie simplement au format JSON le format, le cours chargé
avec certains instructeurs.
Mais l'exemple que je voulais de donner ici est que,
Je fais bien sûr JSON ID.
Et dans les paramètres aller chercher, Je précisant nécessite vrai,
qui est une option qui est documenté dans Bookshelf
où il est dit que: «Si, J'essaie de trouver ce cours
et il n'est pas là, puis jetez une erreur ".
Et cela devrait être pris en la prise bloquer ici.
Allons donc de l'avant et revenir en arrière dans l'inspecteur de noeud et d'essayer
et briser ce et voyons ce que nous avons.
Donc, nous allons définir une pause ici sur le parcours JSON.
Très bien.
Je vais bien sûr à JSON et Je voudrais juste faire quelques -
[Pause]
Il peut être un peu délicat parfois, lorsque vous essayez
à gérer que l'on a été rafraîchi
et qui n'ont pas - nous allons voir.
C'est tellement appelant erreur réponse vide.
[Pause]
Jetons un débogueur ici.
En raison de la manière dont le noeud optimise réellement
pour l'exécution JavaScript pour être si rapide sur le serveur,
parfois le débogueur de noeud a quelques erreurs lorsque vous essayez
et points d'arrêt dynamique et vous faites réellement besoin
d'utiliser un débogueur et pas la ligne par ligne.
Voyons donc si ce nous reçoit ce que nous voulons.
Alors je me mis, app.get Identifiant du cours de JSON,
et j'ai mis mon débogueur il
dans la déclaration des captures en bas.
Fetch nécessite vrai, il se doit - tout droit, là nous allons, cassé.
Donc, maintenant je peux voir qu'il a cessé
à ce bloc catch finale parce que le withRelated -
ou parce que le besoin de vrai précisé et il n'est pas sûr
avec l'ID de cette grande nombre moyen d'une exception
qui est maintenant eMessage.
Et chaque erreur en JavaScript possède une propriété de la pile
qui vient avec elle.
Donc, il est souvent utile Pour exemple,
consoler déconnecter e.stack.
Et je peux réellement voir quand je frappe une erreur.
Alors je me mets erreur vide réponse, c'est le message
qui a été envoyé par l'intermédiaire de bibliothèque.
Mais maintenant, je peux prendre un coup d'oeil au, à la pile des appels et voir
que dans Bookshelf modèle dialectes SQL 83,
cette réponse vide erreur a été levée.
Et c'est là que je mentionné, il est dot anonyme
parce que c'est un anonyme fonction.
Si c'était une fonction de nom vous auriez de meilleures idées
à qui, en réalité à travers sans avoir à passer
dans le code model.js.
Bien qu'il soit destiné à être assez, assez lisible,
donc je ne peux voir que en ligne.
Qu'est-ce qu'ils disent moi j'étais la ligne 83.
Donc, si options.require et la réponse n'existait pas,
il jette maintenant un nouveau vide erreurs de réponse.
Donc vous pouvez voir assez simple comment cela fonctionne.
Et à l'intérieur dans Bookshelf,
il es juste un ensemble bouquet d'utilisation de promesses.
Ainsi, vous pouvez spécifier Promise.method
avec la bibliothèque Bluebird qui maintient le bon contexte
cela en retour une promesse.
Et donc j'ai - je liaison la valeur de ce même
à ce que j'avais dit plus tôt, mais en utilisant des promesses
et alors je peux - est nouveau.
Il peut être asynchrone ou pas si je veux.
Et puis je fais un peu d'autres choses qui peuvent
ou peuvent ne pas être asynchrone et alors sortes de sauts vers le bas ce.
Donc Promise.all est une aide qui un grand nombre de bibliothèques populaires ont
où vous pouvez avoir une tableau de potentiellement peut
ou peuvent ne pas être des promesses.
Et une fois que toutes les personnes sont terminé, vous revenez que
puis il saute à la ligne suivante
et vous pouvez voir comment il vraiment s'aplatit la pyramide
que vous obtenez, enfer rappel que son connue
si vous faites tout avec la ligne de rappels par ligne.
Il existe des moyens de contourner que les promesses, mais sont un
des meilleures façons, à mon avis
pour vraiment garder votre code propre et facile à lire.
Donc, c'est juste une courte introduction à JavaScript
et à Bookshelf et Knex en général.
Et, s'il ya des questions, Je sais que c'est une tonne de matériel
en quelque sorte de tenter de couverture d'autant plus que les langues,
contrairement à la plupart que vous êtes familiariser avec donc je voulais juste
de faire en sorte qu'au moins si vous rencontrez des problèmes
avec votre code, vous peut sorte de sauter dans -
c'est ce que je voudrais faire, c'est sorte de sauter dans les bibliothèques
que j'utilise et voir comment les choses sont structurées.
Il ya celui que j'avais mentionné précédemment appelé Backbone.js
et en fait c'est [Inaudible] sur le côté client
pour aider à donner la vue du modèle Structure de régulateur
à votre code.
Mais elle a effectivement source de documentation annotée
qui vous permet de trier de voir.
C'est vraiment bien documenté, ce qui se passe,
comment c'est augmenter la fonctionnalité Ajax
ou la fonctionnalité de l'évènement Les modèles et les collections de tri
d'expliquer ce qui est passe dans le processus.
Et si vous comprenez les bases de JavaScript
comme l'héritage prototypal et à quel point les fonctions utilisées
que les deux objets et les valeurs et des classes et tout.
Il est beaucoup plus facile de comprendre ce qui se passe
sur potentiellement dans le bibliothèques que vous utilisez
et le code du débogueur et être en mesure pour ne pas être cogner la tête
contre le mur parce vous ne comprenez pas comment l'
différentes pièces travaillent, donc.