了解NodeJS中的回调函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解NodeJS中的回调函数相关的知识,希望对你有一定的参考价值。

我是Node Js和回调机制概念的新手,我有工作代码使用ldapjs基于LDAP验证用户,但我想知道它在数据流和回调方面的工作方式。

在下面的代码中我几乎没有疑问,有人可以帮我澄清

  1. 这对cb(err === null, err, res);意味着什么
  2. 当我用fake_res做console.log时它显示为true为什么它是真的?
  3. 我看到一些帖子引用我们需要使用错误作为第一个回调,是这样吗?
  4. 最后我想了解为什么输出和authDN中使用的res是相同的
  5. 最后一般回调在NodeJS中是如何工作的

在提出这个问题之前,我已经浏览了很多论坛,但无法与下面的代码联系起来

  1. Link 1
  2. Link 2
  3. Link 3
  4. Link 4

var express = require('express');
var util = require('util');
CircularJSON = require('circular-json');
var router = express.Router();
var ldap = require('ldapjs');
var bodyParser = require('body-parser');
var userNT;
var password;


var app = express();

function authDN(dn, password, cb, res) {
  var client = ldap.createClient({
    url: 'ldap://localhost:389'
  });
  client.bind(dn, password, function(err) {
    client.unbind();
    cb(err === null, err, res);
  });

}

function output(fake_res, err, res) {
  if (fake_res) {
    console.log('success');
    res.status(200).send('{"status":"success"}');

  } else {
    console.log('failure');
    res.status(401).send('{"status":"failure"}');
  }

}

app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({
  extended: true
})); // support encoded bodies

router.post('/login', postData);

function postData(req, res) {
  userNT = req.body.ntid;
  password = req.body.password;
  authDN(userNT, password, output, res);
};


module.exports = router;
答案

好的,让我们一步一步尝试:

在这里,如果你看到authDN有第三个参数cb,那么这就是你的回调函数。现在要追溯它,检查在authDN函数中调用时,提供给此函数postData的参数值,这里cb = function output

现在你输出的第一个参数是fake_res,它是true还是false,这取决于client.bind的响应

如果它失败了你会得到一些错误因此它将继续是错误的。这里是你的问题2的答案,因为你的凭证似乎是正确的,因为这个错误等于null,因此你的fake_res总是正确的。

回答问题4是因为它被传递为param以将响应发送回使用router.post进行的API调用

关于3号,它使用错误第一次回调更具可读性和更好,但不是必需的。

以上是关于了解NodeJS中的回调函数的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的处理Nodejs中的异步回调

NodeJs异步的执行过程

Nodejs:catch块中的回调函数在try-catch中返回未定义的参数

nodejs异步回调函数中this问题,求助

nodejs中的回调与直接调用函数

nodejs是同步还是异步