了解 NodeJS 中的回调函数
Understanding Callback function in NodeJS
我对 Node Js 和回调机制的概念 很陌生,我有使用 ldapjs
基于 LDAP 对用户进行身份验证的工作代码,但我想了解该机制在数据流和回调方面的工作方式。
在下面的代码中我有一些疑问,有人可以帮我澄清一下吗
cb(err === null, err, res);
是什么意思
- 当我用 fake_res 执行 console.log 时,它显示为
true
为什么它是真的?
- 我看到一些 post 提到我们需要使用错误作为第一个回调,是这样吗?
- 最后我想了解为什么输出中使用的 res 和 authDN 相同
- 最后是回调在 NodeJS 中的一般工作方式
在问这个问题之前,我浏览了很多论坛,但无法与下面的代码联系起来
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
这是你的回调函数。现在回溯检查在 postData
函数内部调用时提供给此函数 authDN
的参数值,这里是 cb = function output
现在输出的第一个参数是 fake_res 是真还是假,这取决于 client.bind
的响应
如果失败,您将得到一些错误,因此它将继续为错误。这是您 问题 2 的答案,因为您的凭据似乎总是正确的 err 等于 null 因此您的 fake_res 是总是正确的。
回答问题 4 这是因为它作为参数传递以将响应发送回您使用 router.post
[=17] 进行的 API 调用=]
关于 数字 3 它只是更具可读性和更好地使用错误第一次回调,但不是必需的。
我对 Node Js 和回调机制的概念 很陌生,我有使用 ldapjs
基于 LDAP 对用户进行身份验证的工作代码,但我想了解该机制在数据流和回调方面的工作方式。
在下面的代码中我有一些疑问,有人可以帮我澄清一下吗
cb(err === null, err, res);
是什么意思
- 当我用 fake_res 执行 console.log 时,它显示为
true
为什么它是真的? - 我看到一些 post 提到我们需要使用错误作为第一个回调,是这样吗?
- 最后我想了解为什么输出中使用的 res 和 authDN 相同
- 最后是回调在 NodeJS 中的一般工作方式
在问这个问题之前,我浏览了很多论坛,但无法与下面的代码联系起来
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
这是你的回调函数。现在回溯检查在 postData
函数内部调用时提供给此函数 authDN
的参数值,这里是 cb = function output
现在输出的第一个参数是 fake_res 是真还是假,这取决于 client.bind
如果失败,您将得到一些错误,因此它将继续为错误。这是您 问题 2 的答案,因为您的凭据似乎总是正确的 err 等于 null 因此您的 fake_res 是总是正确的。
回答问题 4 这是因为它作为参数传递以将响应发送回您使用 router.post
[=17] 进行的 API 调用=]
关于 数字 3 它只是更具可读性和更好地使用错误第一次回调,但不是必需的。