Javascript Nodejs函数求值说明
我刚刚开始使用Nodejs和Expressjs构建定制应用程序。我在理解一段代码时遇到了一些困难。我不知道为什么这个代码能工作。如果我能得到一个关于代码的解释或者一个更好的方法,我将不胜感激 使用的成分 我正在使用nodejsv0.10.25和expressv3.4.8 场景 这段代码用于登录身份验证。用户名和密码是JSON格式的。JS函数将POST中表单提交的用户名和密码作为参数,并对照JSON进行检查。如果用户名和密码在JSON中匹配,则函数返回true,否则返回false 下面是代码 JSON文件Javascript Nodejs函数求值说明,javascript,json,node.js,express,Javascript,Json,Node.js,Express,我刚刚开始使用Nodejs和Expressjs构建定制应用程序。我在理解一段代码时遇到了一些困难。我不知道为什么这个代码能工作。如果我能得到一个关于代码的解释或者一个更好的方法,我将不胜感激 使用的成分 我正在使用nodejsv0.10.25和expressv3.4.8 场景 这段代码用于登录身份验证。用户名和密码是JSON格式的。JS函数将POST中表单提交的用户名和密码作为参数,并对照JSON进行检查。如果用户名和密码在JSON中匹配,则函数返回true,否则返回false 下面是代码 JS
[{
"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;
}
}
});
}
/* 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();
}
}
/* 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()获取post值并在app.js中适当重定向
/* 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;
}
}
});
}
/* 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();
}
}
/* 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中的用户名和密码作为参数传递
我敢肯定,我在这里做错了什么。如果有人能帮我的话,那就太好了。
verifyLogin
是一个函数
对象。所有对象的计算结果均为true
也就是说,当在条件上下文中使用非布尔类型时,它将转换为布尔对象。在ECMA语言中,它将使用抽象ToBoolean
操作进行转换
Boolean(verifyLogin) //true
!!verifyLogin //true
此外,每次需要用户身份验证时,您都会读取login.json文件。在启动时读取并缓存登录对象。您也不需要使用fs.readFile
,因为可以使用require
导出.json文件
var login = require('json/login.json');
更好的方法是使用verifyLogin
作为中间件:
Array.prototype.any
将在条件评估为true时立即返回,非常适合此操作
function verifyLogin() {
var login = require('json/login');
return function (req, res, next) {
var body = req.body,
authenticated = login.any(function (user) {
return body.email === user.username && body.password === user.password;
});
if(authenticated) {
req.session.user_id = body.email;
res.redirect('/inside');
}
else {
res.render('index', {
title: 'Logged in',
error: 'The username and password you entered is incorrect'
});
}
}
}
verifyLogin
是一个函数
对象。所有对象的计算结果均为true
也就是说,当在条件上下文中使用非布尔类型时,它将转换为布尔对象。在ECMA语言中,它将使用抽象ToBoolean
操作进行转换
Boolean(verifyLogin) //true
!!verifyLogin //true
此外,每次需要用户身份验证时,您都会读取login.json文件。在启动时读取并缓存登录对象。您也不需要使用fs.readFile
,因为可以使用require
导出.json文件
var login = require('json/login.json');
更好的方法是使用verifyLogin
作为中间件:
Array.prototype.any
将在条件评估为true时立即返回,非常适合此操作
function verifyLogin() {
var login = require('json/login');
return function (req, res, next) {
var body = req.body,
authenticated = login.any(function (user) {
return body.email === user.username && body.password === user.password;
});
if(authenticated) {
req.session.user_id = body.email;
res.redirect('/inside');
}
else {
res.render('index', {
title: 'Logged in',
error: 'The username and password you entered is incorrect'
});
}
}
}
verifyLogin
是一个函数
对象。所有对象的计算结果均为true
也就是说,当在条件上下文中使用非布尔类型时,它将转换为布尔对象。在ECMA语言中,它将使用抽象ToBoolean
操作进行转换
Boolean(verifyLogin) //true
!!verifyLogin //true
此外,每次需要用户身份验证时,您都会读取login.json文件。在启动时读取并缓存登录对象。您也不需要使用fs.readFile
,因为可以使用require
导出.json文件
var login = require('json/login.json');
更好的方法是使用verifyLogin
作为中间件:
Array.prototype.any
将在条件评估为true时立即返回,非常适合此操作
function verifyLogin() {
var login = require('json/login');
return function (req, res, next) {
var body = req.body,
authenticated = login.any(function (user) {
return body.email === user.username && body.password === user.password;
});
if(authenticated) {
req.session.user_id = body.email;
res.redirect('/inside');
}
else {
res.render('index', {
title: 'Logged in',
error: 'The username and password you entered is incorrect'
});
}
}
}
verifyLogin
是一个函数
对象。所有对象的计算结果均为true
也就是说,当在条件上下文中使用非布尔类型时,它将转换为布尔对象。在ECMA语言中,它将使用抽象ToBoolean
操作进行转换
Boolean(verifyLogin) //true
!!verifyLogin //true
此外,每次需要用户身份验证时,您都会读取login.json文件。在启动时读取并缓存登录对象。您也不需要使用fs.readFile
,因为可以使用require
导出.json文件
var login = require('json/login.json');
更好的方法是使用verifyLogin
作为中间件:
Array.prototype.any
将在条件评估为true时立即返回,非常适合此操作
function verifyLogin() {
var login = require('json/login');
return function (req, res, next) {
var body = req.body,
authenticated = login.any(function (user) {
return body.email === user.username && body.password === user.password;
});
if(authenticated) {
req.session.user_id = body.email;
res.redirect('/inside');
}
else {
res.render('index', {
title: 'Logged in',
error: 'The username and password you entered is incorrect'
});
}
}
}
函数验证登录(用户名、密码){
var文件='json/login.json';
var isValidUser=假;
试一试{
var data=fs.readFileSync(文件“utf8”);
data=JSON.parse(数据);
对于(变量i=0;i
此回调中的代码只返回true。因为这是一个异步回调。检查syncReadFile函数 函数验证登录(用户名、密码){
var文件='json/login.json';
var isValidUser=假;
试一试{
var data=fs.readFileSync(文件“utf8”);
data=JSON.parse(数据);
对于(变量i=0;i
此回调中的代码只返回true。因为这是一个异步回调。检查syncReadFile函数 函数验证登录(用户名、密码){
var文件='json/login.json';
var isValidUser=假;
试一试{
var data=fs.readFileSync(文件“utf8”);
data=JSON.parse(数据);
对于(变量i=0;i