NodeJS 中的“完成”属性是啥?

Posted

技术标签:

【中文标题】NodeJS 中的“完成”属性是啥?【英文标题】:What is the attribute "done" in NodeJS?NodeJS 中的“完成”属性是什么? 【发布时间】:2015-04-23 18:33:06 【问题描述】:

我正在按照本教程在 NodeJS 中编写本地登录代码:

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

在 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'));
            

我是 NodeJS 和 javascript 的新手,我不明白像“done”这样的值如何成为函数(返回 done(err))。有系统功能吗?

非常感谢!

【问题讨论】:

回调函数。它将结果返回给您传递给它的函数。 这只是回调的名称,我说对了吗? 是的!这是回调的名字,你可以随意命名 【参考方案1】:

done 是您完成工作后需要调用的回调。如您所见,它在代码的第一行中给出:

function(req, email, password, done)

这意味着除了传入的请求之外,您还会获得用户指定的emailpassword。现在您需要做任何您需要做的事情来验证登录。您需要以某种方式告诉 Passport 您是否成功。

通常,您可以为此使用返回值,但在这种情况下,Passport 作者考虑了您的检查可能是异步的选项,因此使用返回值是行不通的。

这就是使用回调的原因。大多数情况下,回调被称为callback,但这只是为了方便,没有技术上的理由这样做。在这种情况下,由于回调用于显示您已完成,因此 Passport 作者建议将其命名为done

现在,如果凭据验证失败,您可以调用 done 并显示错误,或者使用适当的参数来表明验证成功。

之所以有效,是因为函数在 JavaScript 中是所谓的一等公民,即代码和数据之间没有实际区别:在 JavaScript 中,您可以将函数作为参数传递并返回值可以用数据。

就是这样:-)

【讨论】:

但是,我的代码中没有定义如何回调。我怎么知道? 其实是:在第1行作为参数交给你的代码。 @DavidLuque:至于你是怎么知道的,语言中没有任何特性可以告诉你。所以只使用你不知道的语言。您必须阅读该库的文档(在本例中为 passport.js)。所以如果你写一个 js 库,写好的文档也很重要 @Golo 我无法理解。我们没有promises 吗?或async? 是的,但在 2015 年没有 async 关键字。【参考方案2】:

在 JavaScript 中,函数是第一类对象。

它们可以存储在变量中并像任何其他数据一样传递。

函数声明在当前范围内创建一个与函数同名的变量。

function call_done(done) 
    done();


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


call_done(some_function);

【讨论】:

理解的好答案

以上是关于NodeJS 中的“完成”属性是啥?的主要内容,如果未能解决你的问题,请参考以下文章

属性中的“属性:”一词是啥

有限元分析时划分网格的标准是啥?

如何使用 NodeJS 将数据添加到 MongoDB 中的数组属性?

CSS属性中的“auto”值是啥意思。

Java FX 中的“mnemonicParsing”属性是啥

Dmatches 中的距离属性是啥意思?