了解NodeJS中的回调函数

时间:2017-12-29 06:48:55

标签: node.js callback asynccallback

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

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

  1. cb(err === null, err, res);
  2. 意味着什么
  3. 当我使用fake_res执行console.log时,它显示为true为什么是真的?
  4. 我看到一些帖子引用我们需要使用错误作为第一个回调,是吗?
  5. 最后我想了解为什么输出和authDN中使用的res是相同的
  6. 最后回调在NodeJS中的运作方式
  7. 在提出这个问题之前,我经历了很多论坛,但与下面的代码无关

    1. Link 1
    2. Link 2
    3. Link 3
    4. Link 4
    5. 
      
      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;
      
      
      

1 个答案:

答案 0 :(得分:1)

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

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

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

如果失败,您将收到一些错误,因此它将继续为假。这是问题2 的答案,因为您的凭据似乎是正确的,因此错误等于null 因此您的fake_res始终为true。

回答问题4 这是因为它是作为参数传递的,以便将响应发送回您使用router.post进行的API调用

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