Javascript Nodejs函数求值说明

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

我刚刚开始使用Nodejs和Expressjs构建定制应用程序。我在理解一段代码时遇到了一些困难。我不知道为什么这个代码能工作。如果我能得到一个关于代码的解释或者一个更好的方法,我将不胜感激

使用的成分

我正在使用nodejsv0.10.25和expressv3.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;
          }
      }

    });
}
/* 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