Nodejs功能评估说明

时间:2014-02-07 04:03:31

标签: javascript json node.js express

我刚开始使用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中的用户名和密码作为参数传递?

我确信,我在这里做错了。如果有人可以帮助我,真的会很棒。

2 个答案:

答案 0 :(得分:2)

verifyLoginFunction个对象。所有对象都评估为true。

也就是说,当在条件上下文中使用非布尔类型时,它将转换为Boolean对象。在ECMA中,它将使用抽象的ToBoolean操作进行转换。

Boolean(verifyLogin) //true

!!verifyLogin //true

此外,每次需要用户身份验证时,您都在读取login.json文件。在启动时读取它并缓存登录对象。您也不需要使用fs.readFile,因为可以使用require

导出.json文件
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函数!