>> Tous droite.
Ainsi, le cliffhanger était, ce qui est node.js comme vous le savez il aujourd'hui?
Quelque chose? Ouais?
>> Il était comme un cadre écrit le JavaScript
applications largement -
>> OK, cela fonctionne.
>> - Je sais que tu aimes utilisations courantes comme -
ou quelque chose que vous peut faire, c'est comme -
[Inaudible Remarque]
>> OK bon.
Ouais, il est donc un cadre.
C'est un moteur qui vous peut exécuter du code JavaScript
site de serveur.
Cela peut signifier la simple des choses
comme écrire une ligne de commande scénario pas en Python ou en Bash
ou Ruby ou PHP, mais juste en JavaScript se
et en l'exécutant à une clignoter invite de commande.
Ou vous pouvez réellement fonctionner il l'intérieur d'un serveur web.
Et en fait, dans node.js lui-même,
ce cadre est tout un tas des bibliothèques qui sont parmi
dans le serveur HTTP intégré.
Ainsi, vous pouvez réellement écrire un serveur comme nous le verrons
dans un instant, Super facilement par juste pour comprendre un peu
de HTTP et TCP et les ports.
Et vous pouvez reproduire une écoute serveur Web Apache sans,
sans IIS de Microsoft.
Sans aucune autre logiciels installés,
vous ne pouvez reproduire ce et d'écouter plus de n'importe quel port
sur le système qui vous êtes autorisé à.
Donc cas et des points, permettez-moi d'aller d'ouvrir
jusqu'à cet exemple, le serveur 0.js.
Donc remarquer que le sommet de ce fichier, juste un tas
des commentaires sans intérêt, et puis il ya un couple
des lignes de code représentatives que nous allons voir de façon récurrente.
Donc, var HTTP obtient exiger "HTTP".
Alors intégré à Node.js ' infrastructure est tout un tas
des modules qui sont vraiment juste bibliothèques et tout est une sorte
de l'espace de nom avec l'identifiant unique
comme celui-ci est «HTTP».
Alors que, comme dans beaucoup d' langages comme Java et C + +
et C, uniquement lorsque vous importer ou inclure
ou dans le noeud parler nécessite un module fait ses bits.
Et toute la mémoire exige obtenir chargé
dans la mémoire vive et donc utilisée.
Ainsi, vous sorte de charger ce bibliothèques ou modules sur demande.
Cela signifie aller de l'avant et nécessite
pour ce programme la bibliothèque HTTP,
et se référer à cette bibliothèque par moyen d'une variable appelée HTTP.
Mais ce symbole de gauche pourrait ont été appelés rien, foo,
bar, baz, ce n'est pas grave.
Donc, contrairement à C + + et Java et C où quand vous avez besoin
ou importer une bibliothèque, il en quelque sorte
de devient accessible à l'échelle mondiale,
modules Node.js sont plus étroitement espace de noms.
Alors que le propre - cette fonctionnalité n'est accessible pour le moment
par le biais de ce nom de la variable.
Vous ne pouvez pas commencer méthodes de typage qui existent
dans les choses d'une manière ce qui est probablement une bonne,
car alors votre espace ne soyez pas presque aussi encombré
que dans un grand nombre de langues.
Très bien, alors maintenant que la commune proposer, en créant un serveur HTTP
Jonathan [supposé orthographe] était possible est littéralement
aussi simple que d'appeler le méthode de création de serveur à l'intérieur
du module HTTP.
Donc, ce est de retour la référence
à une sorte de serveur web.
Il est venu à Apache, pas poids nécessairement plus lourd.
Celui-ci est un peu plus simple.
Et maintenant, je dois juste tout simplement faire quelques petites choses.
Alors d'abord, permettez-moi de faire défiler vers le bas ici
et passez le gestionnaire Procédé pour un moment.
Et remarquez cette ligne de code,
server.on qui est signifie essentiellement serveur -
écouter comme dans le code jQuery,
écouter un événement appelé demande
et juste une supposition que dois-je faire
quand un événement de demande incendies dans le serveur.
Ouais?
>> Appeler le gestionnaire de fonction.
Donc, exécuter littéralement le Code qui est référencé
par cette variable, et en fait pas une variable à symbole ici,
quel est ce symbole référence?
Eh bien, ce nom de fonctionner ici
et gestionnaire apparemment prend deux arguments.
Pourquoi deux? Eh bien, si vous venez de lire le pas de documentation
pour ce module particulier, vous sera dit que le gestionnaire
qui seront évoquées seront réussi au moins deux arguments,
une référence à la demande,
et à l'intérieur de la demande, nous littéralement signifier la requête HTTP.
Donc, tous ceux-têtes HTTP que vous pourriez rappeler
dès le début de l' semestre ou une classe avant
ou de l'expérience comme l' obtenir la ligne et la ligne d'accueil
et la ligne User-Agent, tout cela est encapsulé à l'intérieur et plus
de cet objet de la demande.
Et l'objet de réponse est triés pour les données sortantes.
Donc, vous avez une référence à un objecter que cela va vous permettre
pour envoyer des informations à le navigateur en appelant des méthodes
sur ce dernier argument appelé Res pour la réponse.
Mais ce pourrait être appelé foo ou bar, ce ne sont que des conventions.
Alors maintenant, je fais quoi?
Eh bien, il semble que l'intérieur de ce serveur Web super simple
que je suis la mise en œuvre, je suis va faire ce qui suit.
Je vais écrire un HTTP header avec le code d'état 200,
200 sens OK, tout va bien.
Et puis, je vais de transmettre apparemment.
Quel est le type de données Le deuxième argument de la tête à droite?
>> C'est un objet?
>> C'est un objet avec combien de clés et de valeurs?
Juste un de chaque, à droite, une valeur de clé de paire.
Ainsi, «type de contenu».
Et la seule raison Je cite ici est
parce que le trait d'union pourrait être confondu pour un signe moins
ou quelque chose comme ça.
Donc, je dois citer ici, singe ou des guillemets.
Mais paradigme nouveau commune
dans le code JavaScript est souvent apostrophes ces jours-ci,
côlon et la valeur.
Donc, ce n'est que le soi-disant type de l'esprit.
Il s'agit d'un en-tête HTTP C'est littéralement aller
être un type de contenu de trait d'union côlon texte slash plaine qui va
à envoyer de l' serveur au navigateur
afin que le navigateur sait si pour exécuter ce texte Raw
ou HTML ou comme un image ou un film
ou un fichier flash ou rien d'autre.
Maintenant, où que je veux réellement à envoyer dans le corps de la page?
Eh bien, par la lecture la documentation
de l'objet de réponse à l'intérieur de cette bibliothèque.
Je vois qu'il ya un droit méthode et qui prend une chaîne,
peut-être d'autres choses, mais mini-chaîne.
Et la chaîne est ce qui est cracher au navigateur.
Dans ce cas, sa super simple, son monde de bonjour,
mais il pourrait être opne support, html, ferme la parenthèse,
tête de support ouvert, à proximité support et ainsi de suite,
cela pourrait être html Raw.
Mais nous gardons l'exemple simple, simplement en crachant
le plus simple des types d'esprit qui est sans doute text / plain.
Et puis juste Response.End signifie fermer la connexion
et envoyer tout ce que j'ai sorte de tampon à l'intérieur
de cet objet de retour au navigateur.
Je suis fait. Très bien.
Ainsi, la dernière chose Je fais ici
et cela est quelque peu arbitraire et destiné à être cool,
c'est que je suis dis la serveur enfin écouter
sur une certaine TCP par défaut le port.
Rappel de début de classe que les services -
ou vous généralement unique identifier par le nombre,
AD est le web, 443 est basé sur HTTP sites, 22 est SSH, FTP est 21
et 1337 est juste arbitraire mais il est supérieur à 1024
ce qui signifie que sur la plupart systèmes, je peux l'utiliser
sans avoir besoin de super- privilèges de l'utilisateur.
Il est donc juste pratique.
Mais 8080 est en arrêt - une commune un, 8088, vraiment quelque chose de grand
dans les milliers que commune mais ce n'est que plus d'élite.
Très bien, alors ce qui se passe quand je lance ce fait?
Eh bien, je ne visite pas seulement la page dans un navigateur.
Ce fichier est appelé serveur 0.js.
Parce qu'encore une fois, Apache est maintenant hors de l'image
pour le deuxième semestre du cours.
Si je veux web serveur, j'ai besoin d'écrire
et puis exécutez ce serveur Web.
Mais il s'avère que JavaScript à la fois sur le côté client
et côté serveur est un langage interprété.
Donc, tout ce dont j'ai besoin est un interprète.
Il être donc - si insister pour exécuter noeud et serveur 0.js,
Je peut ou peut ne pas voir partie de la production en fonction
sur ce que les bibliothèques J'ai inclus, rien ne semble se passer.
Mais permettez-moi de passer à un navigateur et laissez-moi aller
à la même adresse IP de mes clients CS50.
Mais ce pourrait tout aussi bien être mon Mac
ou mon PC, puis appuyez sur Entrée.
Cela semble effectivement comme Apache.
C'est comme le répertoire Liste des nous avons examiné
au cours du premier semestre.
Alors, qu'est-ce que j'ai fait de mal?
Ouais.
[Inaudible Remarque]
Exactement, non?
Ainsi, Apache est toujours à l'écoute sur le port 80 par défaut.
Même si je pouvais changer cela, Je ne pouvais éteindre tous ensemble
mais il est toujours en cours d'exécution.
Mais ces gars-là peut certainement coexister.
Je n'ai tout simplement de mettre côlon 1337 et peut-être
ou peut-être pas une barre à la fin pour accéder à ce port
que ce serveur est exécuté.
Et maintenant, je vois que bonjour, monde est de retour.
Et je peux frapper rechargement comme autant de fois que je veux,
il est toujours au service d'une page.
En effet, si j'ouvre Chrome inspecteur, aller à réseau
puis recharger la page entière,
en effet remarqué que ce n'était la demande qui a été envoyé.
Si je regarde la source Raw,
remarqué mon navigateur envoie toutes ces choses.
Et puis la réponse de le serveur était super simple.
Il est le 200.
Si ce n'est pas trop faible sur l'écran,
il est du type de contenu.
Et puis Node.js sorte de automatiquement
pour moi ajouté la date et tous les autres trucs
que les navigateurs s'attendent généralement.
Donc, nous allons voir juste un petit test de cohérence.
Permettez-moi de revenir sur le code en serveur-0.js et laissez-moi -
chaque fois que je vais dans le gestionnaire,
permettez-moi de vous dire console.log.
(«Nous avons eu un visiteur! ').
Je n'ai pas besoin de recompiler ou quelque chose comme ça,
c'est un langage interprété.
Alors maintenant, permettez-moi de revenir à la page, recharger un, deux,
trois fois et aller revenir à ma fenêtre.
Et maintenant, je vois cela.
Eh bien, c'est étrange, Je vois six lignes.
Intéressant anecdotes web, pourquoi Je me demande six pas trois?
Ouais?
[Inaudible Remarque]
Ouais. Donc, comme vous le savez l' petite icône stupide dans le top
de la barre de navigateur que beaucoup
de sites Web peuvent utiliser une crête de Harvard,
il pourrait être un logo d'entreprise ou quelque chose comme ça.
Ainsi, les navigateurs de nos jours sorte
de présomption faire une demande HTTP supplémentaire
à presque tous les sites Web que vous visitez vérifiez s'il existe
par défaut d'un fichier appelé favicon.ico
dans le même répertoire que le fichier que vous avez demandé.
Et si c'est le cas, il met l'icône de là.
Donc tout ce que nous voyons C'est exactement cela.
Et en fait, nous allons voir si nous peut voir ce plutôt que le type
au juste, «Nous avons eu un visiteur.
Permettez-moi aller de l'avant et de sortie.
Et je sais que cela se en regardant la documentation.
Il ya une propriété à l'intérieur de l'objet de requête appelé URL
qui se trouve être la voie
qui a été demandé dans l'URL.
Donc, si je redémarre le serveur simplement en exécutant de nouveau noeud
le serveur-0.js et maintenant ne présente un, deux,
trois et revenir ici.
Il est là.
Slash est ce que je - l'humain demandé
en favicon.ico est ce que le navigateur est
demande méchamment.
Mais il ne s'agit pas tellement favicon trucs
mais comment le serveur est utilisé.
Ouais?
>> Pourquoi cela at-il à une certaine demande?
>> Pourquoi cela at - par la nature de la façon dont fonctionne HTTP.
Donc, HTTP ne peut demander un seul fichier à la fois.
Les navigateurs peuvent être intelligent ces jours
et garder le TCP connexion ouverte.
Si vous avez pris CS143 ou généralement familiariser avec la mise en réseau,
de sorte que vous pouvez obtenir des gains d'efficacité
en gardant le réseau socket ouvert
dans la prise multiple HTTP demandes en série sur elle
mais ils sont d'un fichier par demande.
Donc, si vous visitez quelque chose comme -
Je veux dire que nous pouvons aller à la plupart des sites.
Si vous allez à - nous allons tirer vers le haut l'inspecteur de l'Chrome ici.
Il peut obtenir plus remplir de la page.
Allez dans l'onglet réseau et aller à www.cnn.com.
Et lorsque vous visitez cnn.com, sa page d'accueil -
votre navigateur plutôt atrocement fait - ce n'est pas fini.
OK. Au moins 289 HTTP demandes encore et encore.
Et c'est pourquoi lorsque vous visitez sites particulièrement gonflés,
ils sont lents à charger à cause de tout
des actifs qu'ils chargement.
Ainsi, il semble que 298.
Il pourrait y avoir Ajax passe à ce point ou certains
des actifs sont tout bas.
Ainsi, chacun d'entre eux est un demande individuelle de revenir
et-vient, d'avant en arrière.
Et c'est pourquoi, plus tôt, même si nous sorte de parlé
à ce sujet quelque peu fantaisiste où vous mettez la balise script,
rend absolument une différence lorsque vous avez -
il commence à avoir beaucoup de trafic et beaucoup
des fichiers demandés.
Et chaque cela représente probablement une image, un fichier multimédia,
un fichier JavaScript fichier CSS ou similaire.
Donc, nous sommes déjà à quelques 4 Mo seulement
à regarder les nouvelles du jour.
Bonne question.
Très bien.
Alors, quelles sont certaines des les bons côtés si?
Droite, nous savons comment faire pages Web déjà avec PHP.
Et beaucoup d'entre vous sont venus pour la classe sachant Django
et Python ou Ruby avec rails.
Alors, pourquoi avons-nous besoin d'un autre langue et de l'infrastructure?
Ce qui est particulièrement node.js bon à savoir si vous?
[Pause]
Quelque chose?
Non? Ouais?
>> Relayer les messages.
>> Donc, relayer les messages.
Donc, c'est vrai et c'est vrai pour une raison plus technique
et que Node.js et vraiment JavaScript est particulièrement
bien adapté à asynchrone code,
si dans lequel vous créez l'illusion
de faire multiple choses à la fois.
Donc, même si elles sont qui se passe réellement en série,
en effet, dans la plupart des cas, JavaScript fois côté client
et côté serveur est mono-thread.
Qui, si vous prenez 161 ou même 61 signifie que -
de ce programme savoir,
l'interprète peut littéralement faire qu'une seule chose à la fois.
Mais ce n'est pas idéal pour quelque chose comme un serveur Web
où vous pourriez avoir des dizaines ou des centaines ou peut-être même des milliers
de tous les utilisateurs qui tentent pour accéder à votre page web
au même moment.
Et pourtant, que suggérer que l'un de leur manipulation
après l'autre après l' autre surtout si certains
demande de ceux que nous avons vu sur CNN pourrait nécessiter servir
jusqu'à 300 fichiers avant de même obtenir au prochain utilisateur
qui veut voir le dit nouvelles.
Node.js est mieux adapté pour les environnements tels que.
Parce que ce qui se passe est tout processus de marche lente
comme la lecture d'un fichier sur un disque ou l'interrogation d'une base de données ou de parler
à un autre serveur de réseau,
qui tend à avoir latence, non?
Si vous n'avez prendre 61 ou 161 en particulier tous de ce genre
de services périphériques ont tendance à être beaucoup plus lent
que de faire quoi que ce soit à l'intérieur de la même RAM et la même unité centrale de traitement
que dire dans ce cas, la serveur est effectivement en cours d'exécution.
Mais ce qui est agréable sur Node.js est que vous pouvez -
et plus généralement le JavaScript est que vous pouvez faire quelque chose
puis dire, "Hmm, cela va
me prendre quelques millisecondes ou même quelques secondes.
Permettez-moi de sorte de fourche off », mais ce n'est pas un vrai processus.
Et puis quand il a fait faire qui ralentissent le processus en cours d'exécution
comme l'accaparement des lignes d'une base de données ou de lire un fichier. html
à partir du disque, il sera revenir à moi plutôt
que moi d'avoir à attendre.
Donc, pour le rendre plus clair.
C'est mon moyen d' ce qui en fait plus familier.
Très bien, c'est donc le Shake Shack à la place.
C'est en quelque sorte un paradigme commun
pour expliquer asynchronisme.
C'est en fait un bon exemple parce que Shake Shack
et Burger savoureux sont remarquablement ralentir pour ce qu'ils font.
Mais le fait est qu'ils sont vraiment bon à prendre les commandes
et prendre votre argent après que vous attendez pour votre nourriture.
Donc, c'est en fait une meilleure conception que l'alternative.
Parce supposons que vous entrez dans un magasin de ce genre et vous avez obtenu
à l'avant de la ligne et vous passé votre commande et que vous voulez
à hamburger, du mieux que je peux dire, il faut au moins cinq
ou plusieurs minutes à effectivement obtenir un hamburger.
Donc, ce serait un peu d'un modèle de mauvaises affaires
si pendant que vous attendez pour votre hamburger, Alice [orthographe supposé]
et Bob [supposé orthographe] et Charlie [de l'orthographe supposé]
et tout le monde est file d'attente derrière vous
et vous êtes littéralement bloquez la file d'attente pour votre nourriture.
Alors, évidemment, au Shake Shack
et autres fast-food lieux ne le font pas,
ils font quelque chose comme ça.
Ils vous donnent un buzzer.
Et ils sorte de vous envoyer sur votre chemin.
Et ils vous rappeler par faire cette petite chose vibrer
ou flash pour obtenir votre attention.
Donc, c'est littéralement ce que?
Quelque chose comme node.js fait.
Si node.js ou JavaScript plus généralement, est utilisé
et le programmeur est assez intelligent
à réaliser, "Vous savez quoi?
Tout ce que je dois faire droit ici pourrait prendre un certain nombre
de millisecondes ou secondes.
Vous savez quoi?
Permettez-moi aller de l'avant et non appeler synchrone -
"C'est le blocage de type tout le monde en ligne ", -
laissez-moi aller de l'avant et sorte de pas de côté
et tout simplement me rappeler
quand cette longue marche l'opération est terminée. "
Et de rappeler des cours est fait allusion dans ce cas
à une fonction de rappel, un référence à un mandrin de Code
qui seront exécutés lorsque votre hamburger est prêt,
tout comme cette chose avoir une certaine type de fonctionnalité intégrée
qu'il commence à vibrer ou bourdonnement quand il est temps pour vous
être rappelé à l'avant de la ligne.
Alors, qu'est-ce que ce signifie concrètement?
Eh bien, nous devons travailler notre chemin.
Alors, laissez-moi aller de l'avant et cela en premier.
Dans serveur 1.js, laissez-moi première simplifier le code
afin que nous puissions prendre des mesures de bébé vers un problème plus convaincante.
C'est exactement le même programme que j'ai écrit avant.
Mais ce qui a été changé?
Il ya une sorte de légère différence syntaxique
entre ce dernier et Version 0 il ya un moment.
Qu'est-ce qui saute aux yeux vous si vous vous en souvenez?
Ouais Cynthia [supposé orthographe]?
[Inaudible Remarque]
Ouais. Alors maintenant, nous avons une ligne de la fonction étant passé po
Nous avons réussi à se débarrasser de la sorte
de inutilement nommé fonction de gestionnaire.
Nul seulement en ce que, avant même l'appeler en un seul endroit,
Je n'ai pas vraiment besoin de perdre du temps en lui donnant un nom
et rend plus difficile à lire le début de code en bas.
Donc, nous allons juste déclarer en ligne est une fonction anonyme.
Et je fais deux autres choses.
Je fais mieux utilisation de la notation par points.
Donc, comme dans jQuery, beaucoup de noeud méthodes peuvent être enchaînés.
Donc, une fois que vous avez terminé l'appel quelque chose, vous n'avez pas
attendre à une nouvelle ligne et appeler une autre méthode,
il vous suffit de chaîne ensemble.
Et de cette façon, nous pouvons vraiment serrer cela.
Donc, c'est littéralement une le serveur web en cinq lignes
code totale contrairement à la -
contrairement à ce que vous pourriez normalement à faire pour mettre quelque chose en place.
Si je vais dans le serveur 2 maintenant, nous allons le faire.
Dans le serveur 2 - fait de laisser revenir à ce serveur 2.
Nous allons maintenant ouvrir asynchrones 0.js et remédier à ce problème à la main.
Alors d'abord, allons-y l'avant et ouvert
jusqu'à asynchrones-0.js dans le navigateur.
Donc asynchrone-0, me laisser aller au navigateur.
Hit rechargement.
Et maintenant, c'est un peu de message d'erreur.
En effet, je vois une 500 dans l'inspecteur de Chrome.
Mais laissez-moi plus précisément demander hello.txt.
OK. Donc, cela semble fonctionner.
Donc asynchrones 0.js ne semble pas servir à quelque chose pour slash.
Il n'a pas de support de fichier par défaut.
Mais si je explicitement demander hello.txt,
qui semble être à l'appui.
Pourquoi est-ce?
Eh bien, ce que j'ai vécu ici
et fait est mis en œuvre un serveur web super simple
qui montre où asynchronisme peut être utile.
Et qui est mis en œuvre comme suit.
Tout d'abord, je suis en utilisant le module HTTP à nouveau,
mais aussi FS qui représente probablement?
En général, dans CS, système de fichiers.
Système de fichiers OK.
Donc suite FS, système de fichiers.
Très bien, alors ce cela me donne?
Fonctionnalités liées à fichiers comme se passé,
l'ouverture de fichiers, l'écriture répertoires, les répertoires de lecture
et tout ce genre de trucs.
Alors maintenant le constater, ce code est le même que précédemment,
créer le serveur, en passant dans une fonction anonyme.
C'est une sorte de discrimination arbitraire.
Ce n'est pas une très serveur Web sécurisé.
En fait, vous pouvez accéder à plus n'importe quel fichier sur mon disque dur
ou sur le serveur de disque conduire par exécution de ce code
parce que je suis aveuglément en supposant que je vais
à saisir ce que l'utilisateur souhaité à l'URL.
Et je vais préfixer avec le point
de sorte que je suis légèrement être en sécurité
en disant tout ce qu'ils peuvent fichier demande doit commencer au moins
dans le répertoire courant.
Bien sûr, il ya une menace ici.
Parce que si ils la place inclure quoi?
Dans leur chemin, ils peuvent genre de contourner cela aussi.
Point, point, non?
Ainsi, si l'utilisateur vient de mettre point, point dans l'adresse URL, en théorie,
ils pourraient commencer à mon - et dire le fichier de mot de passe.
Donc, ce n'est pas censée pour être fixée,
il est destiné à être simple.
Donc, ici, j'ai une variable qui est le point de concaténation
qui est présent répertoire et l'URL de requête
que nous avons vu avant est comme réduire ou / hello.txt.
Alors maintenant, il obtient un peu plus intéressant.
Notez tout d'abord le fond.
Je suis à l'écoute sur le même port que précédemment.
Donc, la vraie intéressant travail est à l'intérieur d'ici.
Chaque fois qu'une demande vient dans la nature
de ce code, que fais-je?
Je fichier appelant la méthode de lecture de fichier système,
passant dans le chemin que je veux lire.
Et maintenant, c'est ce qui est intéressant ici,
cette mise en oeuvre est par en méthode asynchrone.
Vous ne pouvez pas obtenir un retour valeur de fichier en lecture.
En fait demeure, il est expression pas à gauche
à la gauche de fichier en lecture.
Il ne retourne pas de valeur.
Au contraire, il appelle un rappel fonctionner lorsqu'il est prêt
de vous rendre une réponse.
Donc encore une fois pour être clair, alors que dans antan,
dans de nombreux programmation langues, si vous vouliez
à lire un cas de fichiers au point PHP,
fichier de soulignement obtenir souligner contenu,
vous avez une expression du côté gauche dans toute la valeur après -
avant le signe égal, cela signifie que vous affectez
à cette variable le retour La valeur de cette fonction.
Vous pouvez le faire en node.js, mais vous avez généralement
d'appeler explicitement synchrone versions de fonctions aiment,
Je pense que c'est synchronisation lu fichier ou synchronisation lire le fichier.
J'ai oublié comment ils l'ont nommé.
Et ce serait donner vous une valeur de retour.
Mais si ce fichier est sur un système de fichiers distant
ou le disque est tout naturellement lent, il pourrait prendre 10 millisecondes
ou 2 secondes pour que le fichier à fait revenir.
Pendant ce temps, aucun autre bande les visiteurs sont desservies
par votre websit.
Vous blocage.
C'est ce qu'on appelle IO blocage, d'entrée / sortie.
Donc, ici, ce qui est beaucoup plus intelligent.
Parce que ce que Node.js va
à faire sur l'interprétation est la suivante,
il va appeler la méthode de fichier de lecture,
essayez l'une le fichier qui a obtenu un trajet spécifié par la valeur P.
Et puis, si et quand il est prêt pour vous redonner le contenu
du fichier P, elle fera appel une fonction dont la signature est
par convention, la suivante.
Deux arguments, le premier de qui est peut-être un objet d'erreur,
E majuscule, c'est un objet appelé erreur ou Null
s'il n'y a pas une telle erreur.
Et le second argument - prendre une supposition - va être quoi?
C'est ce qu'on appelle les données de toute évidence, mais ce qui est des données plus concrètement?
>> Matières?
>> Le contenu de hello.txt dans l'exemple que j'ai tiré
dans mon navigateur, il ya un moment.
Donc, en d'autres termes de lire le fichier et beaucoup Node.js fonctions
comme à ne pas renvoyer des valeurs.
Ils appellent les rappels et passent
à ces rappels ce qui serait ont été traditionnellement le
valeur de retour.
L'avantage de cette approche est
que l'on pourrait appeler lire le fichier T0.
La fonction de rappel force pas être appelé un tick plus tard
pour ainsi dire à T, il l'on pourrait appeler un T1000,
un mille ticks plus tard.
Mais le fait est que la reste du code dans ce fichier,
si tout serait immédiatement être exécutée alors que node.js
et tandis que le système de fichiers chiffres à lire
ce fichier et obtenir de nouveau à vous.
Donc, vous créez ce -
de manière efficace l'illusion
de parallélisme tout en laissant processus plus lent n'est pas
bloquer les choses importantes, la partie que l'entretien utilisateurs.
Alors, comment pouvons-nous gérer cela?
C'est un très commun paradigme node.js.
Et il ya moyen juste pour simplifier c'est nous verrons avant le long.
J'ai d'abord vérifié si L'erreur n'est pas nulle.
Donc, si ce n'est pas faux puis il ya eu une erreur.
Je ne sais pas ce que c'est, peut-être ne le fichier n'existe pas.
Je n'ai pas eu les autorisations.
Le chemin est erroné.
Un certain nombre de choses qui pourrait aller mal.
Pour l'instant, je vais arbitrairement retourner le 500
qui est une erreur interne du serveur.
Quelque chose s'est mal passé.
Je ne m'inquiète pas vraiment à diagnostiquer.
Donc, nous allons simplement dire l'utilisateur, il est cassé.
Et puis, je vais faire res.end,
et c'est notation abrégée.
Rappelons que la dernière fois que j'ai fait res.write
et puis j'ai fait res.end.
Si vous ne voulez envoyer une ligne de production,
vous pouvez juste faire tout à la fois avec res.end avec un argument,
et que ça va envoyer quel que soit le message d'erreur est
l'intérieur de cet objet au navigateur.
Il a été assez un arc, rappeler il ya un moment.
Je n'ai aucune idée de ce que destiné au premier coup d'œil.
Mais quand j'ai demandé une fichier qui n'existait pas -
oups, nous avons besoin de courir le serveur à nouveau.
Quand j'ai demandé un fichier qui n'existait pas, EISDIR,
si quelque chose étant répertoire,
si je fais un peu aléatoire ficelle là,
apparemment cela signifie que le fichier n'existe même pas.
Et c'est parce que mon code est de dire simplement à écrire
à ce que le Raw Message d'erreur est,
donc pas très convivial mais au moins je suis manipulation.
Sinon, si ce n'était pas un erreur de ce que je fais?
Même chose qu'avant broche un 200 OK, une plaine -
text / plain type et de l'esprit puis cracher les données.
Et c'est pourquoi je suis en train de l' contenu de hello.txt qui vient
pour confirmer si je regardais à hello.txt,
il est littéralement juste bonjour, monde.
Et si je changeais ce bonjour, monde, enregistrez le fichier,
relancer le serveur, recharger la page.
Maintenant, je reçois cette version.
Donc, je n'ai vraiment juste réimplémentées un serveur Web
comme il est depuis de nombreuses ans, mais en utilisant Node.js.
Mais nous pouvons faire ce même plus propre.
Permettez-moi de m'ouvrir asynchrones 1.js.
Maintenant, je remarque l'ajout un autre module de ce temps,
apparemment le module de chemin.
Maintenant, c'est une bonne occasion de regarder
à ce que la documentation ressemble.
Node.js est la documentation.
Comme PHP je pense que c'est en fait assez bien
et simple.
Si je vais à Node.js et Google et la recherche de chemin node.js,
ce que vous voyez habituellement est un lien direct vers une URL
que je mets ici il ya un moment.
Donc / api est le lieu officiel aller pour la documentation.
Et ce que vous voyez en haut
de la documentation officielle de noeud est l'ensemble des méthodes et
ou des biens à l'intérieur de ce module particulier,
dont l'un est appelé jointure.
Et jointure est la fonction d'assistance cela va me permettre
de ne pas s'embêter avec tous les avantages.
Et il a ajouté la prime que vous verrez
des quais est-il aussi normalise le chemin résultant.
Ainsi, si l'utilisateur ou si vous avez des points ou de points de points ou toute combinaison
de ce genre de rapport chemins, entre les bons côtés
de la méthode est que les joints il va nettoyer tout ce que vous
et vous donner une canonique chemin sans
de ces points ou de points de points.
Donc, c'est une bonne chose générale en matière de sécurité au moins
si vous vérifiez la valeur de retour que je ne suis pas
dans ce cas simple particulier.
Mais je ne veux l'utiliser.
Donc, je crée maintenant le chemin d'un peu plus programme
avec path.join place de concaténation Raw.
Donc, c'est un peu plus propre qu'avant.
Et remarque maintenant je suis un peu plus intelligent plutôt
que aveuglément essayer de lire le fichier,
Je vais effectivement appeler fs.stat.
Donc, si vous êtes familier
avec de bas niveau C fonctions et C, même PHP.
Beaucoup de bibliothèques ont déclarations de stat cette fonction
essentiellement statistiques sur un fichier, la taille du fichier,
les autorisations, le nom et des choses comme ça,
et aussi, implicitement, si le fichier existe ou pas,
et si c'est un fichier ou un répertoire
ou un lien symbolique ou quelque chose d'autre.
Alors maintenant, remarque, je suis appelant fs.stat.
Et puis apparemment selon à la documentation,
Je dois revenir dans l'objet erreur
ou Null suivi par un objet de statistiques.
Mais nous allons vérifier cela, node.js.fs.
Voici le fichier documentation du système.
Laissez-moi regarder pour les stats.
Il ya beaucoup plus des fonctions ici.
Oups, stat synchronisation, fs.stat.
Donc, ici, il est asynchrone Statistiques (2).
Cela signifie que si vous n'oubliez pas de pages principales,
chapitre 2 de la page principale,
cela signifie que c'est littéralement juste une mise en œuvre de noeud
du niveau bas la fonction du système stat.
Ainsi, la fonction de rappel reçoit deux arguments, l'erreur et stat
où stat est un fs.stats objet.
Voyons donc ce que cet objet est censé ressembler.
Cliquons sur le lien hypertexte et je vois que.
L'objet contient stats apparemment une méthode d'assistance,
est fichier, répertoire est, est un tas d'autres choses.
C'est le "est" fichier que je m'inquiète sur dans ce cas particulier.
Donc ici, je vais.
S'il y avait une erreur, permettez-moi de caution pour le moment
et assumer.
S'il ya une erreur, il était un fichier 404 probablement pas été trouvé.
Il pourrait être quelque chose d'autre
mais je suis un peu paresseux ici juste pour se concentrer
sur les détails les plus intéressants.
Mais pour l'utilisateur de fins, le fichier n'est pas trouvé,
s'il y avait une erreur indiquant le fichier.
Sinon, laissez-moi vérifier si la fichier est effectivement un fichier réel.
Donc, si ce n'est pas un fichier, il existe.
Il ya quelque chose là, mais c'est probablement un répertoire
ou peut-être un lien symbolique
ou quelque chose d'autre qui est génial sur le système de fichiers.
De toute façon, l'utilisateur ne devrait pas le voir.
Alors maintenant, je vais cracher
classiquement 403 non autorisé.
Mais encore une fois juste une convention,
J'aurais pu utiliser autre chose en théorie.
Et puis enfin, permettez-moi essayer de lire le fichier.
Alors, permettez-moi de faire défiler vers le bas.
Et maintenant, remarquez c'est là le code peut obtenir un peu désordonné,
remarque que je vous appelle fs.readFile passage
dans le même chemin, le même callback que la dernière fois,
de sorte que la version précédente.
Et puis si je trouve -
si je ne trouve pas, Je crache sur 500.
Et si je ne trouve, ce ligne que nous allons voir ici?
Nous allons voir les fs écrire tête 200 probablement
et un envoi res.end les données réelles.
Mais remarquez ce.
Et ce n'est pas démonstrative du pire des cas.
Mais j'ai cette stat appel ici que j'ai quelques trucs.
Ensuite, j'ai une autre appel asynchrone ici,
si plus d'indentation.
Alors, juste un peu extrapoler si vous pouviez partir d'ici.
Quel est le problème tend à se poser la langue comme JavaScript
dans cet environnement où vous n'avez pas les valeurs de retour
mais vous avez ces rappels.
Et bien sûr, ce n'est que une chose stylistique le fait
que je garde en retrait.
Mais prendre cela à la la prochaine étape logique.
Supposons qu'il y ait un ou deux ou trois autres fonctions
que je devais exécuter cette étaient par nature asynchrone,
et donc vous juste un peu garder en retrait pour les traiter,
de les traiter, de les manipuler.
Vous obtenez sorte de rappel l'enfer que les gens appellent
où votre code commence d'obtenir très large
et franchement très difficile à lire.
Comme il est, je peux sorte de peine dire que c'est une sorte de flux
qui a ce genre
de stylistiquement angle chose se passe ici.
Donc, ce n'est pas idéal car cela peut très vite devenir
lourd, même si deux asynchrone appelle pas
une grosse affaire.
Donc, nous pourrions éviter cela, non?
Vous avez peut-être entrevu que Je misclicked il ya un moment.
Dans la documentation, vous le savez, on dirait qu'il est statSync.
Et statSync ne prend pas un rappel comme un argument.
Il faut juste le chemin car il ne semble quoi?
Il retourne une instance de fs.stats.
Donc, ce pourrait être votre premier instinct, non?
Surtout si les fonctions de rappel
et est un asynchronisme peu nouveau pour vous, franchement,
l'approche la plus simple est probablement juste éviter le problème tout
ensemble, revenir à trier de la programmation de style CS101
où vous appelez la fonction ou méthode, renvoie la valeur,
appeler la fonction, les déclarations la valeur,
fonction renvoie la valeur.
Et je ne pouvais donc utiliser fs.statSync
qui est littéralement le même mais c'est une version synchrone
ce qui signifie qu'il retourne la valeur.
Il ne passe pas un valeur à un rappel.
Mais pourquoi serait-ce probablement une solution optimale pour recourir
de fonctions synchrones?
Ouais?
[Inaudible Remarque]
Exactement, il prend beaucoup de temps.
Vous êtes juste un ralentissement tout vers le bas.
Parce que tout comme Shake Shack ou Burger savoureux, si ils se sont débarrassés
de ces vibreurs et vous fait, le client reposer à l'avant
de la ligne jusqu'à ce que votre repas est prêt avant même la prise de commande
de la personne derrière vous avez évidemment
par vente ralentit.
Les gens commencent à quitter, vous sorte de dessiner des paquets.
Vous pouvez faire un certain nombre des analogies ici.
Mais enfin, c'est probablement pas une bonne chose
pour les affaires ou pour le serveur.
Code afin asynchrone est généralement bonne au moins
dans ce cas, mais il a certainement commence à causer une certaine angoisse.
Et en fait, je n'ose dire quand premier à écrire ce genre de choses,
ça va prendre un peu de peu de temps pour s'y habituer.
Donc, nous allons commencer à équiper vous avec des bibliothèques
et techniques pour faire ce un peu plus facile.
Ainsi, l'un des plus commun bibliothèques sont des bibliothèques populaires
de nos jours, ce l'un appelé async.js.
Et comme beaucoup de node.js bibliothèques ou modules,
ce sont tous open source.
Ils vivent presque tous et se référentiels de moyeu qui est genre
de devenir de facto endroit pour stocker ces choses.
Et puis il ya un infrastructure tout
pour l'installation de ces choses appelée NPM, Node Manager Package
qui, si vous êtes familier avec EvanTube est une sorte
de l'application ou une application comme obtenir.
Si vous êtes familier Red Hat et Fedora
que dans l'appareil, c'est comme yum.
Mais c'est un noeud - c'est un gestionnaire de paquets juste
pour cet environnement particulier.
Ainsi, nous pouvons télécharger et installer des choses comme la bibliothèque asynchrone
et aussi un autre appelé le souligner bibliothèque ou d'un module.
Mais ces fs autant, HTTP, chemin,
ce sont tous venus intégré au noeud.
Donc, si nous allons à la documentation de l'API, vous allez vraiment voir qui construit
dans le noeud vous obtenez gratuitement tout un tas de modules.
Mais beaucoup de gens sympas sur l'Internet ont fait des dizaines
si pas des centaines de d'autres bibliothèques
à mieux faire les choses ou différemment.
Donc, nous allons jeter un oeil à comment cette bibliothèque fonctionne.
Ainsi, la plupart de ce code est identique pour le moment.
J'ai un chemin étant Créé en haut.
Et maintenant, je vous appelle async.series.
Ainsi, la bibliothèque asynchrone, c'est juste une bibliothèque qui vous permet
passer ou relancer généralement de fonctions se disant un
après l'autre juste à type de éviter ce problème d'indentation,
et vraiment juste le mental angoisse qui invariablement se poser
au moins lors de la première plonger pour cela sur votre propre
la programmation de façon asynchrone.
Comme dans de côté, si vous avez pris 161 et que vous avez fait affaire avec verrous
et d'élever les conditions et tous les de cela, le code asynchrone
et un environnement comme Node.js est en réalité beaucoup,
sans doute beaucoup plus simple
que l'écriture fait code multithread.
Chaque fois que vous avez code multithread,
vous avez des conditions de relance.
Vous avez à vous soucier de deux fils contenant
pour les mêmes ressources disque ou de la mémoire.
La beauté de JavaScript
dans node.js, c'est qu'il ya littéralement un seul thread,
ce qui signifie que le navigateur
ou le serveur ne peut faire une chose à la fois.
C'est juste à vous, le programmeur
de garder un modèle mental pour comment vous sorte de file d'attente des choses
et comprendre comment pour commander votre code.
Mais vous n'aurez jamais à vous soucier sur soulever conditions
exactement de la même façon à moins avec le code Raw comme ça.
Donc, c'est un peu difficile de grack ici.
Mais - Permettez-moi de m'ouvrir les docs pour un instant.
La bibliothèque qui async.js est de même très googleable,
il vit dans le GitHub rempoter comme beaucoup d'entre eux.
Ne pensez pas que c'est sommaire, il n'est pas.
Permettez-moi de défiler vers le bas à l'Lisez-moi ici.
Ainsi, la bibliothèque de async fournit tout un tas
des méthodes à l'intérieur de celui-ci.
Par exemple, il ya une méthode appelée chaque,
qui, si je clique sur cette juste pour voir ses docs pour un moment,
il s'agit d'une fonction ou d'une méthode qui vous permet de faire quelque chose
comme un quatre chaque mais en parallèle.
Ils vont tous arriver potentiellement en parallèle.
Et le procédé est seulement chaque va revenir à vous quand tous
des itérations sont terminées.
Alors peut-être qu'ils se l'un après l'autre.
Idéalement, ils se essentiellement en parallèle.
Mais la méthode ne vous rappeler.
Il ne buzz pas votre jusqu'à ce que tout signal sonore
des éléments que vous avez répétées sur avoir terminé.
Donc, c'est juste une belle façon
d'éviter à l'aide une simple boucle de quatre
mais en train de faire quelque chose de façon asynchrone.
Mais maintenant plus directement associées à cet exemple,
remarquer il ya cette Procédé de série.
Et permettez-moi de tirer une exemple simple canonique.
Donc la bibliothèques asynchrones, série méthode prend en tant implicite
par les crochets de tableau.
Quelles sont les données types d'éléments
dans ce tableau de base sur un exemple simple?
Il s'agit d'un tableau de fonctions.
Donc, en C, vous appelleriez les pointeurs de fonctions.
En JavaScript, il ya plus références correctement aux fonctions
ou fonctions anonymes.
Et cela signifie simplement, les tableaux
bien sûr, sont classées de zéro sur le haut.
Donc, ils ont maintenu un ordre qui est bon
pour une série », série de cause Bien sûr moyen de faire quelque chose
afin de ne pas en parallèle.
Donc, cela signifie juste que cette fonction seront exécutés,
puis celui-ci, alors ce un, celui-ci, puis celui-ci,
Cependant, il ya beaucoup
jusqu'à ce que finalement l'option rappel est appelée.
Donc, notez le paradigme ici.
Et même si ce est la bibliothèque d'un des gars,
il est représentatif de la paradigme JavaScript très commun
utilisant de nouveau des rappels.
Alors, notez ce que vous faites ici.
Dans la première fonction étant passé via ce tableau,
vous avez défini un anonyme fonction qui vient avec la fonction.
Mais remarquez que, apparemment, selon cette documentation,
cette fonction devrait anonyme prendre un rappel de l'argument.
Cela va être un pointeur ou une référence à une fonction
que vous devez appeler lorsque votre code est prêt à retourner une valeur.
Encore une fois, contrairement à juste programmation typiquement procédure
où vous avez l'habitude de retourner les valeurs immédiatement
que une différence avec en utilisant une bibliothèque comme ceci
dans la programmation asynchrone plus généralement, c'est quand vous êtes prêt
pour renvoyer une valeur de une base de données, à partir d'un fichier,
à partir d'une arithmétique expression, c'est à vous
pour appeler la fonction de rappel.
Et la bonne chose de cette bibliothèque
si nous lisons les docs est davantage d'attention que,
si et seulement si toutes le domaine des rappels appelé
sans objet Error, sera le tout réussir?
En d'autres termes, s'il existe deux,
si il ya 10 anonyme fonctions
dans ce tableau donc dans cette série,
que si toutes les réussir,
sera le rappel option finale être considéré comme un succès?
Si quelqu'un d'entre eux échoue, chaque fonction
après il ne sera pas même être exécuté.
Donc, c'est une belle façon de tri d'avoir une connexion en guirlande
qui avorte prématurément si quelque chose va mal.
Donc, pour voir les choses en contexte, ici est de savoir comment nous pourrions ré-implémenter
ce programme précédent.
Je reçois le chemin comme avant, donc c'est la partie facile.
Je Copiez et collez le code squelette
de la documentation, il async.series parenthèse ouverte,
ouvrir crochet.
Et maintenant, j'ai remarqué un fonction en ce début
d'un second, nous verrons où nous allons à partir de ce.
Et maintenant le constater, c'est un peu complexe à première
mais se concentrer uniquement sur ligne par ligne.
Fs.stat signifie obtenir les statistiques ou ne pas de ce chemin.
Appelez ce rappel lorsque vous êtes prêt.
Ce code est le même que précédemment.
S'il ya une erreur, il ya une différence maintenant.
Encore une fois, le paradigme très commun dans la programmation node.js est
si quelque chose va mal et un rappel a besoin de savoir
que, par convention, la première argument pour un rappel va
être pas, si tout va bien ou un référence à un objet d'erreur,
capitale E. C'est comme une erreur classe qui existent à l'échelle mondiale
mais plus sur ce une autre fois.
Donc, en faisant cela, si il ya une erreur, ce qui est la conséquence?
Eh bien d'après ce que je dit la série fait,
est si quelque chose va mal, nous voulons juste un peu
pour annuler l'ensemble de la série fonction de appels anonymes.
Donc, il me suffit de il suffit de retourner rappel passage
dans l'objet Error.
Parce que si stat donné -moi une erreur,
Je pourrais créer une nouvelle objet d'erreur de ma part,
mais je ne m'inquiète pas vraiment,
Je veux juste passer quel que soit le erreur qui se produit en réalité
afin que je puisse passer à ce rappel.
Et juste pour être clair, le retour n'est pas strictement nécessaire.
Je veux essentiellement à faire mais je voulais maintenant ne «retour;
/ / Si bien que pas plus code ici exécute ".
Donc, encore une autre commune convention en JavaScript,
même si vous n'êtes pas retournant une valeur en soi,
vous voulez passer la valeur pour la fonction de rappel
mais alors vous voulez pour arrêter l'exécution
de la fonction que vous êtes dans la façon triviale
pour ce faire est juste appeler revenir ici.
Mais il n'y a rien de mal,
nous faisons juste retour rappel erreur même si ça va
pour revenir à la valeur définie.
Bon, ce n'est pas retourner une valeur la plus probable.
Tout ce qui m'importe est un embarquement poursuite de l'exécution.
Donc, mon amalgame de ces deux lignes est juste un styliste
à la convention juste avoir le numéro de la ligne
de code que je viens d'écrire de 2 à 1.
Alors quoi d'autre?
S'il n'y a pas une erreur -
effectivement être clair Je pourrais aussi éviter
que, ce faisant, si d'autre.
Mais encore une fois, un autre paradigme commun est arrivée
pour vos erreurs là-haut, puis il suffit de retourner plutôt que de continuer
mettre en retrait votre code avec elses et elses et d'autre.
Donc, si ce n'est pas un fichier, maintenant, vous savez,
Je veux traiter ce un peu spéciale.
Donc, ici comme en Java ou C + + ou quelques autres langues,
voici comment peut instancier un s'opposer à saisir erreur passage
dans un message de défaut de pas d'un fichier
et ce n'est que quelque peu arbitraire.
Mais je suis de signalisation une erreur de ma propre.
Et qu'est-ce que ce dernier ligne sans doute signifier?
Tout va bien.
Si vous passez dans nulle pour la paramètre d'erreur, qui vient de dire
par convention tout va bien.
Donc, cela signifie que qui va se passer logiquement?
Si null est passé pour le rappel
que signifie ce anonyme la fonction a réussi
pour ainsi dire.
Donc, ce qui devrait la série méthode précède et ne repose maintenant
sur ma définition verbale plus tôt?
[Inaudible Remarque]
Passer à la suivante, non?
Si elle avait rendu un non-nul valeur, il serait tout simplement abandonner
et pas plus anonyme fonction obtiendrait appelé.
Mais parce qu'il n'a pas, alors ce sera appelé prochain.
Donc, la logique ici est à peu près le même que précédemment
et nous verrons comment nettoyer cette place en outre dans un moment.
Je sais que c'est une sorte de lot
pour absorber toute verbalement et visuellement.
Mais remarquez maintenant, la deuxième fonction anonyme que je veux
à exécuter en série est pour essayer de lire le fichier.
Appelez ce rappel lorsque vous êtes prêt.
S'il ya une erreur, juste le signaler au moyen de la fonction de rappel
de sorte que le reste de l' ce genre de choses est abandonnée.
Sinon NULL de retour.
Mais pourquoi suis-je passais deux arguments?
Eh bien cette fois si je lis le fichier et revenir
comme une variable appelée données,
Je tiens à signifier non seulement tout est bien en retournant null
pour le premier argument.
Je veux retourner au réel données que le second argument.
Parce que si je lis encore dans la documentation,
remarquer ce dernier morceau de code signifie crochet c'est l'
fin de la série.
Il n'y avait que deux anonyme fonctions de cette série.
S'il y avait une erreur ici, alors Je sais que l'un des liens
dans cette chaîne de façon parler échoué.
En d'autres termes, cette erreur va être un objet d'erreur
qui est nul si tout de ces gars-là ont échoué.
Et si c'est le cas, je suis juste va renflouer et je vais
à-dire 400 qui des moyens de demande sûr,
c'est très générique un message d'erreur.
Et puis, je vais imprimer le message d'erreur.
Donc, je ne suis pas la peine de être super anal cette fois,
Je ne vais pas faire la distinction entre 500 et 404 et 403,
Je suis juste un peu vague aveuglément ma main
et dire quelque chose s'est mal passé.
Mais si rien n'a mal tourné,
Je vais envoyer ce res.end passant ces données.
Maintenant cela ressemble un peu énigmatique.
Mais encore une fois si je lis la documentation,
le second argument de cette finale, rappel finale,
le gars qui est exécutée uniquement une fois que la série se fait
d'exécution ou une partie, il de, cela va être un tableau
de tous les seconds arguments
qui ont été adoptées pour le rappel.
Or, il s'avère que l' que le lien de cette série
qui fait revenir à la seconde argument est celui-là.
Je vais donc faire un tri sur une des saut de la foi suffit d'utiliser supposons
pour le moment que est la dernière d'une méthode
qui vous donne la dernière éléments d'un tableau.
Parce que ce tableau C'est d'être adopté
me a deux indicies, zéro et un.
C'est juste zéro n'a pas de valeur parce que ce gars retourne -
ne passe pas dans une seconde argument, mais ce gars fait.
Résultats Donc support zéro est rien,
Résultats support un contient ce,
si vous avez suivi le long jusqu'à ce point?
Le fichier, le bonjour, contenu de monde sans doute,
c'est comme ça que je fait imprimer.
Et laissez-moi finir un détail ici.
Si je fais ce genre de vieux école, si je veux obtenir
les derniers éléments, si je pouvais faire des résultats [results.length-1],
c'est en quelque sorte le chemin de la vieille école
d'accéder aux derniers éléments - ou zéro tableau d'index.
Mais, comme dans le côté, rappeler que j'ai eu cette bibliothèque
ici soulignement qui par convention est simplement appelé
littéralement un trait de soulignement caractère qui n'est pas spécial,
il semble juste frais comme signe du dollar fait pour jQuery.
Ceci est juste une aide méthode soulignent point dernière
que fait exactement la même chose.
Et si vous n'avez jamais utilisé ce avant de souligner JS fois
pour le codage du côté client
et côté serveur est un bibliothèque merveilleusement utile
que le plus grand nombre de personnes décrites il n'aime jQuery contient tous
des méthodes, les gens voulaient venu avec JavaScript lui-même.
OK.
>> Donc, comme assez pour moi et Je regardais dans la série,
vous avez comme rappel comme argument?
>> Oui.
>> Comme si lorsque vous effectivement comme poussée que dans,
et comme ce qui ne lui dire quand vous avez juste
comme callback, puis faire comme -
[Inaudible Remarque]
>> OK, bonne question.
Alors, permettez-moi ôter la asynchrone page principale ici
ou la documentation sur GetHub.
Donc, c'est la canonique structure.
Si vous appel à l'aide de ce notamment la série de la méthode,
il ya deux grands volets.
L'un est un réseau d' fonctions anonymes
et deux, c'est un rappel finale fonction qui est en fait
exécuté à la très fin de la série.
Maintenant, si on fait un zoom dans un peu plus près sur la première
de ces grandes choses, la liste de fonctions anonymes
par cette exigence d' la documentation de type a
d'être un anonyme fonction qui prend
dans un argument appelé rappel ou foo ou bar, ce n'est pas grave
mais il l'appeler rappel.
Et c'est en quelque sorte votre buzzer que Shake Shack vous remet.
Ceci est le moyen par lequel vous pouvez retourner une valeur
pour le client parce que vous peut non seulement ne reviennent littéralement.
Vous devez le faire par moyen de ce rappel.
Parce que si à l'intérieur de ce fonction est un peu lent en marche
code comme base de données de requête, de lire le fichier du système de fichiers,
vous ne voulez pas attendre là et bloquer tout le monde,
vous voulez appeler la fonction de rappel.
Donc, c'est littéralement le nom de l'argument.
Mais comme en C, vous avoir des pointeurs de fonction.
En Java, vous avez méthodes de système de référence
et la même chose ici en JavaScript.
Il s'agit d'une variable, mais son type est fonction.
Donc, tout simplement en écrivant son nom si un rappel ou foo
ou au bar, puis parenthèse ouverte et fermeture de parenthèse,
vous êtes l'exécution de cette sur cette fonction.
Et en passant un nul qui moyens erreur nulle et un
ce qui signifie que c'est l' données que je veux passer po
Et puis le morceau pour être clair, ceci est un autre rappel.
Et ce n'est pas appelé rappel,
il est juste un conceptuellement fonction de la méthode de rappel
car il est appelé par définition,
de la bibliothèque de cet auteur quand l'ensemble de la série est terminée
ou des sous-ensembles de ceux-ci si un erreur qui s'est passé plus tôt.
Ainsi, le nom de la fonction de rappel, appel de la fonction de rappel,
Nom de la fonction de rappel, appel de la fonction de rappel,
rappel différente fonctionner tous ensemble.
>> Nous avons maintenant comme définir rappel?
>> Non, parce que ce gars passera dans votre réseau
fonctions de anonymes,
un pointeur à l'aide du code il veut exécuter.
Exactement, tout droit.
Alors, s'il vous plaît dire que la code obtient un peu plus simple.
Donc, c'est possible.
Et si vous êtes comme moi, prenez confort dans au moins savoir,
il faut un certain temps pour s'habituer à cela.
Mais nous pouvons nettoyer ce un peu,
ne pas jeter trop à vous mais voici une autre variante
et son autre méthode
dans la même bibliothèque appelé cascade.
L'avantage de ce qui est contrairement série où chaque
de ceux anonyme fonctions exécutées essentiellement
indépendamment l'un de chacun des autres.
Cascade comme son nom l'indique permet les fonctions les plus hautes
passer genre de valeurs à la fonction inférieure,
un peu comme une cascade d'eau.
Ainsi, la hausse de cette est que je peux genre
de l'utiliser à mon avantage.
En async.waterfall, Notez les points suivants.
Je peux juste appeler fs.stat passant dans le chemin
que je veux statistiques sur.
Et puis n'oubliez pas avant que je eu une fonction anonyme
qui avait deux arguments se trompent,
ésultats puis j'ai appelé le fonction de rappel manuellement?
En d'autres termes est juste pour être clair, rappelons que plus tôt
en asynchrone 2, j'ai fait tout de ce travail méchant.
J'ai appelé fs.stat passé en P,
déclaré mon propre anonyme fonction.
J'ai ensuite vérifié si l'erreur est pas nulle alors je l'ai fait,
bien je l'ai fait, l'ensemble beauté des conventions suivantes
comme dans node.js est ce rappel en général les fonctions sont destinées
à prendre au moins un argument, un objet d'erreur suivi par zéro
ou des valeurs plus utiles.
Donc remarquer le paradigme ici,
cette fonction de rappel, je suis déclarant suit exactement le
paradigme que ce gars bibliothèque asynchrone ne.
C'est-à-dire, pourquoi suis- Je mettre en œuvre ma propre rappel
méthode lorsque l'auteur de cette bibliothèque est littéralement en me tendant
sur un plateau pour ainsi dire, un fonction de rappel que je peux utiliser?
Donc, je ne peux passer à la référence, il m'a donné
de sorte que, immédiatement, mes plusieurs lignes
de code deviennent une ligne de code.
Maintenant, où allons-nous avec ça?
La fonction suivante que Je veux exécuter,
la prochaine anonyme fonction dans ce tableau
de fonctions effectue les opérations suivantes.
Remarquons d'abord stat est le premier argument.
Donc, quelque chose a déjà changé.
Maintenant, ce type qui a écrit la bibliothèque -
et je dis mec parce que c'est un mec.
Ce gars qui a écrit cette bibliothèque est des garanties de documentation
que si cette fonction ici me repasse un objet d'erreur
ou nulle suivie d'un coma liste séparée des autres valeurs,
il fera en sorte que les les autres valeurs sont remis
à cette fonction anonyme dans l'ordre de gauche à droite.
Et ce qui était juste une fonction de rappel seul tout simplement
devient le dernier tel argument.
Maintenant, je ne sais pas qui je suis en se concentrant sur seulement vous savez.
Mais maintenant, ce qui est la emporter ici?
Donc, nous savons à partir de la documentation
ou le couple avant d'exemples
que fs.stat s'attend finalement un rappel avec deux arguments,
l'objet d'erreur qui est une objet d'erreur ou nulle suivie
par une référence à des stats objet.
Donc, si je pense à ce sujet, objets d'erreur statistiques de coma objet,
qui correspond dans le paradigme de la bibliothèque de cette personne.
Donc, je peux simplement dire parce Je ne le second argument
que c'est - cela va être adopté par fs.stat
à la fonction de rappel est dans l'erreur, stats par définition de cette bibliothèque,
Je peux mettre le deuxième le nom de l'argument ici
ou tout ce que je peux renommer
si je veux suivre par le rappel ici.
Donc, je peux passer un valeur d'ici à là.
Maintenant, tout ce code si certes un peu cryptique est
au moins copier coller pour la plupart d'avant.
La seule différence est préavis ici je déclarer une erreur
objet et maintenant je veux pour obtenir un peu amateur.
Je veux vraiment savoir ce que l'erreur a été, donc je vais
de rentrer à l'intérieur de cet objet un propriété arbitrairement appelé code
de sorte que je sais que ce n'est pas un fichier
qui devrait être non autorisée, c'est un HTTP 403.
Permettez-moi de me souviens qu'avant Je passe l'objet d'erreur
pour le rappel.
Et puis essayer enfin de lire le fichier, dans ce cas,
la cascade, j'ai cassé le code de deux grandes étapes
en trois étapes plus petites.
Remarquez la beauté ici,
Je peux appeler fs.readFile passant dans le chemin.
Et puis la partie la plus difficile mentalement, c'est que je passe juste
dans le rappel de l'homme.
La chose qu'il me remettant, je suis va passer à fs.readFile.
Parce que nous sommes tous en adhérant les mêmes conventions,
premier argument à une fonction de rappel est un objet d'erreur ou nulle suivie
par un coma ou séparés liste des choses utiles.
Donc, ce que cela signifie maintenant et si je lire la documentation je sais
ce, le dernier rappel, ce gars ici dehors
des crochets qui se passe être passé dans l'objet erreur
ou nulle que je devrais vérifier pour comme toujours avec ce code ici.
Et puis, par définition, de ce procédé
dans la documentation de l'homme, la dernière valeur retournée
de la dernière méthode dans mon tableau anonyme -
ma liste de fonctions anonymes.
Alors, qu'est-ce que lire le retour de fichiers
et je suis sur un retour lâche maintenant.
Je veux dire ce qui ne lu passe de fichiers comme arguments
à la méthode de rappel sa main?
Deux arguments, est la première un objet d'erreur ou nulle,
c'est presque toujours va être la réponse.
Et la deuxième chose va à être ce que pour le fichier de lecture?
Le contenu du fichier, données que nous avons appelé plus tôt.
Ainsi, en déclarant tout simplement err, entraîner,
et de vérifier l'erreur ce est en quelque sorte ennuyeux maintenant.
Sinon, je fais res.end passant dans ce résultat.
Ce sera sans aucun doute pas synchroniser parfaitement
jusqu'à ce que vous écrire vous-même.
Mais pour l'instant, prendre distance au moins le fait
qu'il n'y a apparemment ce paradigme commun, de sorte que si nous
et les auteurs de bibliothèques toutes sortes de bâton
à cette convention des méthodes de rappel.
Et le premier argument est un objet d'erreur ou nulle.
Et les deuxième et troisième
et quatrième objets sont des choses nous nous soucions et nous sorte
de suivre les règles et documentation.
Nous avons commencé avec le code qui est honnêtement assez laid.
Et même si la plus récente exemple est franchement un peu difficile
pour envelopper votre esprit autour, c'est au moins visuellement,
On dirait que c'est beaucoup plus serré.
Et une fois que vous obtenez à l'aise avec lui, il est tellement plus facile
et il est donc beaucoup moins enclins à bugs que cet exemple précédent.
Alors, permettez-moi de démontrer une dernière chose ici.
Ceci est une version trois.
Et - Non, laissons celui-ci seul.
Permettez-moi d'aborder un couple de autres dernières choses que teasers.
Très bien, alors dans le serveur 2.
OK. Tout d'abord, des questions, Je sais que c'est beaucoup
mais vous vouliez plus instructions, et alors?
Vous n'avez pas dit bon instruction nécessairement.
Ouais?
[Inaudible Remarque]
Corriger, vous êtes essentiellement clémentes pour le système d'exploitation
de comprendre comment jongler toutes ces balles à la fois,
lecture d'un fichier, la lecture d'un base de données.
Et c'est ce serveur JavaScript lui-même que c'est un seul thread.
Et pour l'essentiel et en fait,
il ya une image Je n'ai pas vomir,
et ce n'est pas nécessairement tout ce qui instructif
mais peut-être nous donnerons vous un modèle mental.
JavaScript lui-même et le noeud
en particulier a ce dite boucle d'événements.
Lequel, vous pouvez penser de node.js, le programme,
est littéralement comme une boucle infinie.
C'est juste une boucle sauvage, en attendant et attendre et attendre,
la recherche de tâches à accomplir.
Et la tâche pourrait être, aller chercher quelque chose à partir d'une base de données
ou ici c'est une valeur de la base de données ou aller chercher ce fichier
à partir du disque ou voici un demander à un utilisateur.
Toute sorte d'événement, tout comme l'événement navigateurs entraîné,
de sorte que le serveur événement parallèle entraîné.
Et aucune de ces choses constituent des cas.
Donc, quelqu'un dans node.js, juste écrit une boucle infinie,
une grande boucle sauvage, en attendant pour des trucs pour arriver.
Et que des choses se produit, il se retrouve dans une file d'attente, non?
Certes, une base de données peut renvoyer une valeur.
Et un système de fichiers, l'exploitation système peut retourner une valeur
à peu près au même moment mais il va probablement
y avoir une commande pour eux.
Et node.js va ont essentiellement une file d'attente
comme un grand tableau ou une vecteur, une structure de données
que tampons de tous de ces choses.
Parce qu'il peut littéralement seulement manipuler l'un d'eux à la fois.
Ainsi, lorsque vous, le développeur,
écrire JavaScript asynchrone code en utilisant asynchrone
fonction, vous permettant cette dite boucle d'événements pour accéder
à la prochaine tique, non?
Donc, tant que vous immédiatement retour tous
de ces méthodes asynchrones faire comme fichier en lecture et stat,
ils retournent immédiatement car le rappel par la suite
revient.
Dès que vous retournez,
cela signifie que quelqu'un d'autre peut se sauté hors stock ici
ou qu'il peut obtenir sauté hors en avant de la file d'attente ici.
Et oui, il est en fait la sérialisation
de tout ce qui se passe,
même si tous ces trucs peuvent se produire en parallèle
sur un système multithread.
Mais lui-même et Node.js le serveur ont été en cours d'exécution
comme un fil.
Et le bas côté de qui est t que vous n'avez pas nécessairement max
sur votre ordinateur de la capacité est aussi particulièrement
si vous avez un noyau ou 16 même un ordinateur à 2 conducteurs
et vous êtes juste courir une instance de nœud.
Mais si vous avez de nouveau pris quelque chose comme 161,
vous éviter un énorme cauchemar des maux de tête quand il s'agit
de race conditions et serrures et sémaphore
et l'écriture vraiment la code multithread,
si positifs et négatifs.
OK. Donc, retour au code ici, laissez-moi vous propose de commencer
pour simplifier un peu les choses.
Nous avons vu un serveur un peu Il ya ce qui ressemblait à cela.
Donc, c'est sans doute assez simple.
Mais tout comme dans le monde de PHP, il existe des cadres
comme Laravel et il ya des choses comme Rails et Django,
même chose dans le monde node.js.
Et nous passerons plus temps sur ce mercredi
et dans le prochain projet.
Mais si je vais dans un serveur 2 répertoire,
remarquerez quelques paradigmes ici.
C'est donc - il va être un exemple équivalent
mais c'est en utilisant un cadre appelé express.js,
qui est gratuit et open source logiciel comme Rails et Django,
comme Laravel, c'est juste finalement aller
pour être apprécié aujourd'hui Parce que nous avons écrit
ces exemples simples.
Mais faites-nous confiance.
Ce sera très rapidement devenir votre ami
car il permettra d'économiser vous beaucoup de code TDS.
Et un paradigme commun pour une application express.js est
d'avoir un app.js ou server.js fichier qui contient la logique
de votre programme ou à moins le point d'entrée.
Vous pouvez avoir plusieurs fichiers.
Un module sous-répertoire de noeud qui présente les bibliothèques
que vous avez téléchargé comme asynchrone
et s'exprimer dans d'autres.
Et puis package.json, package.json ressemble à ceci,
et vous pouvez le créer manuellement ou outils créent pour vous
et il est littéralement un fichier JSON
et la partie intéressante les dépendances est ici.
Tout comme dans Laravel, vous eu ce répertoire des fournisseurs
et vous avez eu à vous soucier sur les paquets et de faire -
en fait la mise à jour avec Artisan ou des commandes similaires,
les bibliothèques vous ont installé,
de manière similaire avec package.json ici et de gérer les bibliothèques
et les versions que vous vous souciez.
Donc, si j'ai un package.json, Je ne peux tout simplement faire NPM,
Nœud Package Manager installer, il va chercher automatiquement
à ce fichier package.json.
Regardez et voyez, je fais avoir la dernière version
de tous les modules fournisseurs
dans un noeud modules soulignent Annuaire ici ou peut-être
dans certains parent ou Annuaire ancêtre.
Et si non, il est aller les télécharger
et vous verrez tout un tas
de choses HTTP aller à travers le fil.
Ainsi, par exemple, laissez-moi vous montrer le contenu
des modules de noeud juste exprimer.
Permettez-moi aller de l'avant et hardiment supprimer des modules de noeud
de sorte que tout ce que j'ai maintenant est la suivante.
Et si je n'installe NPM, vous aurez voir qu'il va lire
ce fichier package.json et nous avons vu une sortie similaire
pour cela dans le monde Laravel.
C'est le téléchargement de l'ensemble tas de choses et c'est
parce expresse à son tour dépend de tout un tas
d'autres bibliothèques des peuples.
Donc, tous ceux qui sont en quelque sorte le téléchargement de manière récursive.
Jusqu'à présent, si je le fais dans LS nouveau,
il ya mes modules de noeud répertoire de retour
et l'exprimer en retour.
Donc, c'est juste une façon de gestion des paquets simplifier.
Maintenant, si nous regardons la fichier app.js, cela va
comme un retour à notre serveur plus tôt
où nous venons de cracher à «bonjour, monde".
Mais remarquez les paradigmes ici,
d'abord, nous demandons l'autorisation expresse module, nous avons cette ligne
de code qui vous savez de la documentation.
Vous traitez littéralement que la variable de module en tant que fonction,
si ouvert près de parenthèses parenthèses signifie exécuter.
Cela va apparemment retourner quelque chose que nous allons
généralement appeler une application.
Comment ça marche?
Je ne sais pas vraiment.
Je vais laisser quelqu'un d'autre, vous savez, dans le monde expresse écrire cela.
Je vais tenir maintenant sur ses épaules afin de
pour faire ma demande courir un peu plus simple.
Ici, je vais écouter sur ce port particulier
qui pourrait être plus rien.
Et voici le code qui est peut-être davantage penser maintenant
de Laravel et routes.php.
Donc, c'est le souper simple, je suis aller juste pour indiquer un itinéraire
pour slash étoiles, donc tout va être absorbé
par ce gestionnaire de demande.
Le paradigme de traitement de demande est sa fonction anonyme
avec un argument de demande
et un objet de réponse comme avant.
Et res.send dans les moyens express vous envoyez le code suivi
par ce que vous voulez envoyer.
Et bien sûr, vous pouvez faire quelque chose amateur
par envoyer réellement fichiers ou HTML
ou générées dynamiquement contenu.
Mais pour l'instant, tout ce que nous avons fait a été cracher bonjour, monde.
Si nous allons dans trois serveurs, cela est encore amateur juste
vous montrer certaines fonctionnalités.
Et nous vous montrons une version encore plus sexy
de ce mercredi.
Mais si vous avez jamais entendu Socket IO peut-être,
Ainsi je pense que Jonathan ou quelqu'un l'a dit plus tôt,
l'une des choses noeud est vraiment connue
pour est son en temps réel comportement, non?
Pensez PHP MySQL, si vous sont à mettre en œuvre un serveur de chat
en PHP dans lequel deux personnes pouvaient ouvrir une fenêtre de navigateur pour foo.com
et puis commencer IMing chaque autre, Alice dans une fenêtre,
Bob dans un autre de telle sorte que chacun d'eux voit sa
ou ses messages dans l'autre fenêtre.
Comment feriez-vous en PHP et MySQL?
Utiliser ou ne pas utiliser Laravel sorte des immatériel, vous pouvez avoir
comme un fichier index.php.
Et tu dois avoir - dans certains cas, il faut que ça crache
de forme, il n'y a donc va être un formulaire HTML
qui estiment probablement pas par la soumission du formulaire normale
mais Ajax probablement, non?
Ainsi, un gestionnaire de présenter, de manière vous tapez dans un champ de texte,
vous appuyez sur Entrée, puis il obtient envoyer au serveur via Ajax.
Ce que vous faites alors faire sur le serveur?
Donc, vous avez index.php
ou quelque chose point PHP c'est reçu en paramètre HTTP
de l'utilisateur, d'Alice ou de Bob message instantané, que faites-vous
avec elle afin de la propager Bob ou Alice, respectivement?
Je vous veux dire littéralement les outils avec lesquels
à faire dans votre min.
Donc, comme que feriez-vous?
Vous avez une minute pour mettre en œuvre ce programme.
Ouais?
[Inaudible Remarque]
Parfait. Bon, alors vous avez une base de données.
Nous en savons un peu peu de MySQL.
Donc, vous avez une table c'est messages,
ya peut-être une fois timbre, un ID utilisateur,
le corps du message que lui-même créé,
mise à jour et que tout cela.
Alors, que vous stockez dans une base de données.
Et supposons que Alice envoie le premier message, comment Bob obtenir
ce message maintenant à partir de la base de données?
>> Il pourrait être un peu Ajax réponse qui ne cesse d'aller
retour à la base de données top obtenir la [inaudible].
>> Exactement.
Donc le code de Bob qui est le code est le même que Alice est en quelque sorte
d'une relation symétrique,
Le navigateur de Bob possède un code Ajax c'est sans doute peut-être tous les 30
secondes en tirant le serveur via Ajax synchronisation,
y at-il de nouveaux messages?
Y at-il de nouveaux messages?
Toutes les 30 secondes va à être une sorte de sous-optimal
car il doit attendre encore
si Alice littéralement vient d'envoyer le message.
Ainsi, le navigateur de Bob pourrait chaque seconde a frappé le serveur.
Mais cela signifie Alice navigateur frappe le serveur
chaque seconde.
Qu'en est Charlie [Orthographe supposé]
et David [supposé orthographe] et Edward [supposé orthographe]
et chaque autre lettre de l'alphabet?
Quel est le problème de cette approche?
Un grand nombre de hits excessifs -
Je veux dire que vous êtes tout simplement efficace Dosage votre propre vue
ou DDOSing, Distributed Déni de service
sur votre propre site, en ayant tous
de ces utilisateurs exécuter JavaScript code qui vient d'interroger le
diable hors de votre serveur même si nombre arbitraire,
80 pour cent du temps personne n'a dit quoi que ce soit
dans le salon de chat.
Mais vous êtes en train de vérifier pour s'assurer de tel.
Alors PHP dans un grand nombre de langues sont tout simplement pas bon
pour communications en temps réel.
Parce que dans le rappel PHP il ya pas de mémoire centrale, non?
Vous avez des objets de session qui crée l'illusion
de stockage central mais c'est sur une base par utilisateur.
Vous n'avez pas la mémoire globale comme vous le faites dans un servlet Java
en familier ou dans d'autres cadre fonctionne comme cela.
Node.js bien, vous n'avez mémoire globale parce que vous avez
un serveur et que «peut rappelez-vous tout ce qu'il veut
sur tous les utilisateurs.
Et vous pourriez encore une base de données.
Mais la bonne chose à propos node.js aussi, c'est que c'est beaucoup mieux
que quelque chose comme PHP et la création de l'illusion
de multiples manipulation choses à la fois.
Et en fait comme en passant, vous pouvez mettre en œuvre des serveurs de chat en PHP,
mais vous pouvez généralement faire quelque chose qui s'appelle longue scrutin
laquelle vous n'avez pas un ping le serveur à chaque seconde.
Vous ping sur le serveur, le serveur ne répond pas à vous
depuis plus de 30 secondes, il se trouve littéralement
dans une boucle d'attente et d'attente.
Et le serveur vérifie si il ya de nouvelles données dans la base de données
et seulement une fois qu'il vous voit, "Oh, voici un message de Bob, "
ça répond au serveur HTP?
Ainsi, l'effet dans votre navigateur est que l'icône IE ou Mozilla
ou ce que ne cesse de filature pendant 30 secondes à la fois.
Mais l'avantage est, vous n'avez pas de 30 demandes de connexion
en 30 secondes, vous en avez un.
Donc, il est appelé à long scrutin.
Mais encore mieux en web moderne navigateurs est quelque chose qui s'appelle
WebSocket, qui vous prenez le CS143,
vous pouvez effectivement faire une connexion TCP à partir d'un client
comme un navigateur à un serveur et alors s'accrocher à elle
sans l'aide de près autant de ressources
HTTP peut toujours faire.
Et Socket IO est une bibliothèque node.js
qui le rend beaucoup plus facile à faire les connexions socket
ou illusions là-bas à de vieux navigateurs
de sorte que vous pouvez mettre en œuvre cette réelle fonctionnalité de temps de.
Donc, voici un exemple.
Ce truc là-haut obtient un peu plus compliqué
mais c'est surtout de copier et coller de la documentation de l 'socket.io.
Voici maintenant un plus gestionnaire de demande précise.
Si la demande utilisateur un slash, ce fichier que je vais
être apparemment servir à eux?
Index.html.
Et il ya une nouvelle trucs ici flux
que je vais vous montrer dans un instant.
Mais ce n'est qu'une autre façon
de saisir un fichier un peu plus efficacement
que de simplement faire fs.readFile.
C'est un peu plus intelligent surtout pour les gros fichiers.
Tant histoire courte, ces lignes servent simplement
un fichier appelé index.html
qui pour l'instant assumer contient le formulaire HTML qui Alice
et Bob peut communiquer.
Enfin, io.sockets.on, si ce vient de cette ligne ici.
Donc, je ne fais que lire l' documentation io.socket me donne
l'accès à une dite WebSocket avec un navigateur,
entre le navigateur et le serveur.
Je suis à l'écoute de spécial connexion de l'événement qui moyen
quand l'utilisateur en premier frappe le serveur essayer
pour ouvrir cet égard, je suis vais appeler ce rappel.
Et maintenant, je vais faire ce qui suit.
Toutes les cinq secondes, ce que je vais faire?
Je vais émettre ou de diffuser si vous vous souvenez de rien,
le langage graphique serait que un des blocs de diffusion?
Alors, vous allez émettre
ou déclencher un événement appelé arbitrairement à partir du serveur.
Et il va contenir un message Ping
et la date actuelle.
Donc, il s'agit d'une véritable le chat serveur Alice
et Bob peut utiliser, mais c'est genre d'un serveur de chat automatisé
où les messages sont pings juste une sorte de sonar.
C'est juste ce jour à des moments est envoyé toutes les cinq secondes.
Donc, si je lance ce fait chose - et c'est tout.
Pour être clair ici, un avis c'est juste connecte ici.
Alors, permettez-moi d'aborder un les yeux sur cela.
Permettez-moi de faire le noeud de app.js.
Laissez-moi aller à mon navigateur.
Recharger la page d'accueil ici.
[Pause]
Et permettez-moi de terminer l'inspecteur.
Toutes les cinq secondes, j'ai une démonstration même si pas
interactive pour l'homme
de quelque chose qui est passe en mode asynchrone.
Dans l'avis de navigateur, il n'y a pas l'icône de la filature.
Il s'agit d'utiliser une fonction amateur de Chrome dans les navigateurs modernes
de maintien d'une douille connexion sous le capot
et c'est ce qu'on appelle généralement un modèle pub / sub,
publish / subscribe modèle, où nous n'avons pas fait
que très explicitement ici.
Mais ce qui est bien à ce sujet pub générale / sous paradigme est
que vous pouvez avoir un éditeur.
Dans ce cas, l' serveur central et tous
de l'individu navigateurs sont des clients.
Alices et Bobs du monde peut s'y inscrire,
de sorte que vous pouvez transmettre des messages parmi un nombre quelconque d'utilisateurs.
Et même si nous sommes à nouveau ne pas voir l'interactivité,
nous avions peut-être 12 lignes de code juste pour ce faire.
Et ce n'est probablement pas un saut d'imaginer comment vous pourriez fouetter
le fichier index.html qui a une forme de HTML vrai,
peu de code jQuery avec Ajax qui n'envoie pas un jour
mais envoie simplement tout ce que Alice ou le type Bob au serveur
puis le serveur relaiera dehors.
Et je promets d'entrevoir à une dernière chose juste
vous taquiner avec ça.
Si nous allons dans le courant zéro et un,
vous verrez le code qui est juste un peu différent ici.
Juste pour que vous l'avez vu, il s'agit d'une variante
à ce que j'ai appelé la fs.readFile Procédé antérieure, grâce à quoi,
vous pouvez dire node.js, "Allez lire ce fichier en mémoire.
Mais si elle est grande juste donner moi un morceau à la fois ".
Et vous savez peut-être du CS165
161 ou les systèmes de fichiers avoir différentes
propriétés de performance.
Vous pouvez lire dans des blocs de 512 octets
ou 2 kilo-octets ou que ce soit.
C'est un moyen d'optimiser de reprendre de fichier de manière itérative
de sorte que vous pouvez cracher un peu plus rapidement
au navigateur ou à quel que soit le client final est.
Quantité tellement énorme de contenu aujourd'hui et nous allons plonger
plus en détail le mercredi avec Tim [orthographe supposé]
en particulier en regardant la façon dont nous peut se traduire par certaines des idées
à partir de la première moitié de l' Bien sûr Laravel et modèles
dans une bibliothèque qui lui-même écrit appelé Bookshelf.js
qui est de plus en plus populaire dans la communauté
car il vous donne plus de celui-ci,
sinon plus, que l' fonctionnalité de éloquente
qui rappel est que aperçu bibliothèque de Laravel,
donc plus à ce sujet et plus comment
à développer à part entière applications mercredi.
Nous vous verrons alors.