web-dev-qa-db-fra.com

Quel est l'attribut "fait" dans NodeJS?

Je code la connexion locale dans NodeJS en suivant ce tutoriel:

https://scotch.io/tutorials/easy-node-authentication-setup-and-local

Dans le fichier config/passport.js

function(req, email, password, done){
    process.nextTick(function(){
        User.findOne({'local.email' :   email}, function(err, user){
            if(err)
                return done(err);
            if (user){
                return done(null, false, req.flash('signupMessage', 'message'));
            }

Je suis novice en NodeJS et Javascript, et je ne comprends pas comment une valeur comme "done" peut être une fonction (return done (err)). Y a-t-il une fonction système?

Merci beaucoup!

20
David Luque

done est un rappel que vous devez appeler une fois que vous avez terminé votre travail. Comme vous pouvez le voir, il est indiqué dans la première ligne de votre code:

function(req, email, password, done){

Cela signifie qu'en plus de la demande entrante, vous obtenez les email et password spécifiés par l'utilisateur. Vous devez maintenant faire tout ce que vous devez faire pour vérifier la connexion. D'une manière ou d'une autre, vous devez dire à Passport si vous avez réussi ou non.

Normalement, vous pouvez utiliser une valeur de retour pour cela, mais dans ce cas, l'auteur du passeport a pensé à l'option selon laquelle votre chèque peut être asynchrone, donc l'utilisation d'une valeur de retour ne fonctionnerait pas.

C'est pourquoi un rappel est utilisé. Le plus souvent, les rappels sont appelés callback, mais c'est juste pour des raisons de commodité, il n'y a aucune raison technique de le faire. Dans ce cas, puisque le rappel est utilisé pour montrer que vous êtes terminé, l'auteur du passeport a suggéré de l'appeler done.

Vous pouvez maintenant appeler done avec une erreur si la validation des informations d'identification a échoué, ou avec les paramètres appropriés pour montrer qu'elle a réussi.

Cela fonctionne parce que les fonctions sont dites citoyens de première classe en JavaScript, c'est-à-dire qu'il n'y a pas de différence réelle entre le code et les données: en JavaScript, vous pouvez transmettre des fonctions en tant que paramètres et renvoyer des valeurs comme vous le pouvez avec des données .

Et c'est tout :-)

32
Golo Roden

En JavaScript, les fonctions sont des objets de première classe.

Ils peuvent être stockés dans des variables et transmis comme n'importe quelle autre donnée.

Les déclarations de fonction créent, dans la portée actuelle, une variable du même nom que la fonction.

function call_done(done) {
    done();
}

function some_function () {
    alert("Ta da");
}

call_done(some_function);
8
Quentin