javascript - 使用 express 在模块化 node.js 应用程序中创建同步调用和传递值
问题描述
我正在开发一个 node.js/express 应用程序来检查用户帐户的详细信息,以确定他们是否符合登录资源的条件。最初,所有代码都在一个 app.js 文件中,但现在我试图将其分解为模块,以便它可以用于多个位置和资源,每个都有自己的特定标准。该应用程序通过在查询字符串中接收用户名和密码来工作,我将其解析为各自的部分。然后将用户名和密码格式化为 API 调用,以检查凭据是否有效。如果它们是有效的,那么脚本会从他们的帐户中检索更多信息,并且应该根据获取资源访问权限的要求检查返回的值。
我已经设法设置目录和路由,将请求正确地定向到正确的脚本。我无法将我的 API 调用转换为可在多个脚本中使用的实用程序(进行调用不需要更改实用程序,但每个脚本都有不同的标准来比较返回的值)。
我遇到了两个问题。首先,我有多个需要同步运行的函数,并且它们在之前的调用完成之前被调用,所以它们需要进行调用的值在它们开始时仍然是未定义的。其次,我不太清楚如何将实用程序的返回值传递回登录脚本。
以下是登录模块的内容:
var request = require('request');
const pAuth = require('../../utils/authPatron');
var username = '';
var password = '';
var bNumber ='';
var resource = {
authenticate: (req, res, next) => {
username = req.query.username;
password = req.query.password;
console.log('Starting authentication');
console.log(username, password);
if (username.length < 9 || password.length != 4) {
sendFalse(req, res);
}
else {
console.log('Calling pAuth');
return pAuth(username, password, function(bNumber) {
console.log(bNumber)
next();
});
}
},
criteriaCheck1: (req, res, next) => {
console.log(bNumber);
console.log('Starting criteriaCheck1 process.');
next();
},
criteriaCheck2: (req, res, next) => {
console.log('Starting criteriaCheck2 process.');
next();
}
};
Authenticate 解析用户名和密码并将它们保存为整个脚本可以访问的变量(有没有更简单的方法来做到这一点?),然后调用实用程序 pAuth 并传递用户名和密码。pAuth 实用程序具有以下代码:
var request = require('request');
module.exports = (barcode, pin, bNumber) => {
console.log('Running authenticate utility');
var data = JSON.stringify({'barcode': barcode, 'password': password});
var result = null;
request({
headers: {defines customer headers},
url: 'urlToRetrievePatronInfo.somedomain',
body: data,
method: 'POST',
}, function (err, resp, body) {
var resBody = JSON.parse(body);
if (resp.statusCode == 200) {
console.log('Successfully authenicated');
var bNumber = resBody.patronKey
console.log(bNumber);
return bNumber;
}
});
}
Authenticate 将查询值正确传递给 pAuth。pAuth 正在检索 bNumber,但由于某种原因,我无法将其传回进行身份验证。此外,在进行身份验证之前调用了 criteriaCheck。我试图为 pAuth 创建一个回调函数并移动 next(); 进入回调函数,因此在身份验证完成之前不会调用它,但是永远不会调用回调函数并且请求在两者之间挂起。
那么,如何防止在身份验证完成之前调用其他条件检查函数?另外,如何将 pAuth 的结果传递给标准检查?
提前感谢您的帮助!
解决方案
您的代码很难阅读,但这里没有加起来:
console.log('Calling pAuth');
return pAuth(username, password, function(bNumber) {
console.log(bNumber)
next();
});
和这里:
if (resp.statusCode == 200) {
console.log('Successfully authenicated');
var bNumber = resBody.patronKey
console.log(bNumber);
return bNumber;
}
你可能应该做这样的事情
if (resp.statusCode == 200) {
console.log('Successfully authenicated');
bNumber(resBody.patronKey);
}
您的代码还有其他问题。您对 pAuth 的调用是异步的,因此理想情况下您应该这样:
console.log('Calling pAuth');
return pAuth(username, password, function(err, result) {
if(err) return next(err);
console.log(result);
next();
});
你的 pAuth 应该是这样的:
var request = require('request');
module.exports = (barcode, pin, callback) => {
console.log('Running authenticate utility');
var data = JSON.stringify({'barcode': barcode, 'password': password});
var result = null;
request({
headers: {defines customer headers},
url: 'urlToRetrievePatronInfo.somedomain',
body: data,
method: 'POST',
}, function (err, resp, body) {
if (err) return callback(err);
if (resp.statusCode == 200) {
var resBody = JSON.parse(body);
console.log('Successfully authenicated');
return callback(null, resBody.patronKey);
} else {
return callback(new Error('Invalid response: ' + resp.statusCode);
}
});
}
你还会注意到我已经让回调函数接受了两个参数:err、result。这是一个典型的 nodejs 约定,它允许异步函数处理错误和成功。如果定义了 err,如果未定义,则会发生错误,它起作用了,您应该能够读取结果。
推荐阅读
- html - 理解定位 <a> 包裹在 <div> parent 内的元素
- r - 使用 for 循环分配值
- javascript - 如何编写匹配多个分隔符的正则表达式命令,包括任意数量的空格,但不包括等号之间的空格?
- jquery - 我想删除之前添加的课程
- swiftui - Xcode 11 未在 SwiftUI 中显示对象库
- php - 如何在多个数组中嵌套一个数组在php中生成json(用于匹配值)
- apache-spark - 更改 spark.memory.storageFraction
- laravel-5 - 无法解决此错误完整性约束违规:1451 无法删除或更新父行:外键约束失败
- android - 如何确定我的 Android 项目的 gradle 构建文件中需要哪些依赖项
- opengl - 在初始化 SSBO 存储和填充它之间是否需要内存屏障?