我刚开始使用Nodejs和Expressjs来构建自定义应用程序。我在理解一段代码时遇到了一些麻烦。我不知道为什么这段代码有效。如果我得到关于代码的解释或更好的方法来做同样的事情,我将不胜感激。
使用的成分
我正在使用Nodejs V0.10.25和Express V3.4.8
情景
这段代码用于登录验证。用户名和密码采用JSON格式。 JS函数接受从POST中的表单提交的用户名和密码作为参数,检查JSON。如果用户名和密码在JSON中匹配,则函数返回true,否则返回false。
以下是代码
JSON文件
[{
"username": "abc@example.com",
"password": "abc",
"name": "ABC"
}, {
"username": "def@example.com",
"password": "def",
"name": "DEF"
}, {
"username": "xyz@example.com",
"password": "xyz",
"name": "XYZ"
}]
app.js中的JSON验证功能
/* Verify login from JSON */
function verifyLogin(username, password) {
var file = 'json/login.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
console.log('Error: ' + err);
return;
}
data = JSON.parse(data);
for (var i = 0; i < data.length; i++) {
if(data[i].username === username && data[i].password === password) {
return true;
} else {
return false;
}
}
});
}
检查用户是否已登录app.js
的功能/* Check if session exists and user is logged in */
function checkAuth(req, res, next) {
if (!req.session.user_id) {
res.send('You are not authorized to view this page');
} else {
next();
}
}
app.post()获取POST值并在app.js中正确重定向
/* Login: Check POST email and password and redirect user */
app.post('/', function (req, res) {
var post = req.body;
if(post.email && post.password){
if (verifyLogin) {
/* Why is verifyLogin() working WITHOUT parameters */
req.session.user_id = post.email;
res.redirect('/inside');
}
} else {
res.render('index', {
title: 'Logged in',
error: 'The username and password you entered is incorrect'
});
}
});
现在问题
为什么在app.post中的if()块中评估verifyLogin()而不将POST中的用户名和密码作为参数传递?
我确信,我在这里做错了。如果有人可以帮助我,真的会很棒。
答案 0 :(得分:2)
verifyLogin
是Function
个对象。所有对象都评估为true。
也就是说,当在条件上下文中使用非布尔类型时,它将转换为Boolean
对象。在ECMA中,它将使用抽象的ToBoolean
操作进行转换。
Boolean(verifyLogin) //true
!!verifyLogin //true
此外,每次需要用户身份验证时,您都在读取login.json文件。在启动时读取它并缓存登录对象。您也不需要使用fs.readFile
,因为可以使用require
var login = require('json/login.json');
更好的方法是使用verifyLogin
作为中间件:
只要条件评估为真,<{1}}就会很好地适应这种情况
Array.prototype.any
答案 1 :(得分:1)
function verifyLogin(username, password) {
var file = 'json/login.json';
var isValidUser = false;
try {
var data = fs.readFileSync(file, 'utf8');
data = JSON.parse(data);
for (var i = 0; i < data.length; i++) {
if(data[i].username === username && data[i].password === password) {
isValidUser = true;
}
}
return isValidUser;
} catch(e) {
console.log('Error: ' + err);
return false;
}
}
此回调中的代码不会返回任何内容,只能返回true。因为这是一个异步回调。检查syncReadFile函数!