【发布时间】:2016-04-11 21:41:18
【问题描述】:
我一直在开发一个简单的聊天应用程序,它允许用户在简单的群聊中键入消息并让它们实时更新/显示。正因为如此,我决定使用 Firebase,并花了一些时间来适应它的 Web API。但是,当我尝试手动创建一个简单的用户身份验证系统,甚至只是将值列表返回给另一个函数时,我遇到了一些问题。
我正在尝试遵循 MVC 模式,HTML 表单在 global.js 内触发事件处理程序,然后调用控制器文件中的适当方法,进而调用 DAL 中的适当方法。 DAL 转到远程 Firebase 并执行请求的操作。
我的问题是在once 事件处理程序触发后我没有发生任何事情。控制器将执行checkUserLogin() 方法,但不会将任何内容分配给变量loginValid。据我从调试中得知,执行到达事件处理程序的末尾,然后自行退出。我读过一些关于异步 JS 的东西,但不是很了解。
我想要做的就是从 Firebase 检索一个列表,在将结果从 DAL 传递到控制器之前对其进行处理以进行身份验证,然后在控制器中处理结果。出于这些目的,我并不关心实时更新,我只是有时想返回 Firebase 列表中数据的当前快照,并在另一个函数中对其执行操作。
这是我的文件结构(根据需要)。 global.js 包含事件处理程序,负责处理 HTML 页面事件并选择适当的控制器操作 (security_controller.js),然后调用必要的 DAL 操作 (security_dal.js)。
global.js
$(document).ready(function() {
$("#btnSubmitLogin").on("click", btnSubmitLogin_click);
});
function btnSubmitLogin_click() {
doUserLogin();
}
security_controller.js
function doUserLogin() {
var username = $("#txtLoginUsername").val();
var password = $("#txtLoginPassword").val();
//Determine if user is logged in, and react accordingly
var loginValid = checkUserLogin(username, password);
if (loginValid) {
navigateToPage("pageHome");
$("#successMessageLogin").text("Success validating user");
}
else {
navigateToPage("pageLogin");
$("#errorMessageLogin").text("Error validating user");
}
}
security_dal.js
function checkUserLogin(username, password) {
var foundUser = null;
var loginValid = false;
fb_ref.once("value", function(snapshot) {
var list = snapshot.val();
for (var i in list) {
if (list[i].username === username && list[i].password === password) {
foundUser = list[i];
break;
}
}
return loginValid;
});
if (foundUser !== null) {
console.info(foundUser.username);
console.info(foundUser.password);
loginValid = true;
}
return loginValid;
}
我检查了几个类似的搜索,但没有找到任何答案。在以下问题/答案中,答案提到了有关异步 javascript 的内容,并且似乎仅通过将检索到回调函数中的值后需要执行的代码来解决该问题。然而,这与我试图通过我的“MVC 模式”实现的目标背道而驰。 DAL 不应该接触视图,而是将返回的值传递回控制器。
Firebase Query Inside Function Returns Null
理想情况下,这是我想要发生的事情:
-
global.js致电btnSubmitLogin_click() -
btnSubmitLogin_click()在控制器中调用doUserLogin -
控制器中的
doUserLogin调用 DAL 中的checkUserLogin -
DAL 中的
checkUserLogin从 Firebase 检索用户列表并查找与输入的凭据匹配 -
DAL 中的
checkUserLogin向控制器返回真/假,并将其分配给变量loginValid - 控制器决定如何处理这些信息,并根据需要更新视图
注意:我完全知道 Firebase 有自己的身份验证,但我想创建自己的简单版本只是为了我猜的体验。因此,我只需要一个数据列表/数组即可在控制器中进行操作。我也知道过滤/排序的可能性,但是我希望使用这种方法来检查用户,因为我想知道如何检索列表。
如果我完全以错误的方式执行此操作(Firebase 的新手),或者是否应该提供其他内容,请告诉我。谢谢!
【问题讨论】:
标签: javascript jquery asynchronous model-view-controller firebase