【问题标题】:Node.js pass variable/object from one module and return itNode.js 从一个模块传递变量/对象并返回它
【发布时间】:2018-04-01 05:49:50
【问题描述】:

我正在使用node.js express 框架,最初在一个路由文件中编写了获取数据库密码/哈希和比较表单密码/哈希。现在我想将userName 传递给一个单独的模块。该模块应接受userName 并从数据库返回相应的密码/哈希。

在将函数分解为它们自己的模块之前,我们返回哈希并将其传递给下一个函数 (passHash),代码运行良好。现在我已经将函数与 db 调用分开了,我无法弄清楚如何将哈希返回给原始函数。

将函数分成两个单独的文件,我可以成功地将userName 传递给数据库模块(它控制台记录username/hash),但我无法将用户的密码/哈希返回给原始路线中的原始功能。我已经阅读了很多关于如何使用require 将“OR”返回变量/对象从一个模块传递到另一个模块的帖子,但没有关于如何传递变量“AND”返回 post 函数数据。

以下是我在创建这些文件时参考的一些资源

1.) Accepted answer was easy to follow (this is the model I used)

2.) Advanced

3.) Example most answers show one way return functions

4.) Seems to have the answer

此外,我尝试过在几种安排中返回密码/哈希;创建一个对象并返回属性。返回对象,并将对象分配给一个变量并提取类似于上面链接4的属性。

以下是:

1.) 模块化数据库功能 (databaseLoginUser.js)

2.) 调用模块化函数的原始路由 (databaseLogin.js)

3.) 控制台输出(没有错误只是挂起等待下一个函数)

//databaseLoginUser.js

var express = require('express');
var router = express.Router();
var mysql = require('mysql');

module.exports.getModuleFunction = function(userName, callback) {
  queryUser(userName);

  function queryUser(userName) {
    console.log('In Query User; ');
    var database = mysql.createConnection({
      host: "xxx.xxx.xxx.xxx",
      port: "3306",
      user: "UserName",
      password: "Password",
      database: "Students",
      multipleStatements: true
    });

    database.connect();

    console.log('test');

    database.query('SELECT StudentUsername, StudentPassword FROM STUDENT WHERE StudentUsername = ?', userName, function(err, rows, fields) {
      if (err) {
        console.log(err);
      }
      //console.log(rows);
      console.log('Database Returned User: ' + rows[0].StudentUsername);
      console.log('Database Returned Password: ' + rows[0].StudentPassword);
      var hashFromDatabaseBuffer = Buffer.from(rows[0].StudentPassword);
      returnPassHash(hashFromDatabaseBuffer);
      return returnPassHash;
    })

    function returnPassHash(hashFromDatabaseBuffer) {
      console.log('Do I get here?; ');
      return hashFromDatabaseBuffer;
    }
  }
};

queryPass 是调用并返回另一个模块的密码属性的函数,我已经编写了几种不同的方式,但为了简洁起见,决定发布此版本的函数调用。

//loginUser.js
var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var bodyParser = require('body-parser');
var async = require('async');
var app = express();
var expressValidator = require('express-validator');
var securePassword = require('secure-password');
var database = require('./db');
var queryPass = require('./databaseLoginUser');

router.get('/', function(req, res, next) {
  'use strict';
  console.log('in the login user get route');
  res.render('signUp');
});

router.post('/', function(req, res, next) {
  'use strict';
  console.log('in Login Route');
  var userName = req.body.userName;
  var preHashPass = req.body.password;

  queryPass.getModuleFunction(userName, function(data) {
    passHash('', '', data)
  });

  function passHash(userName, preHashPass, hashFromDatabaseBuffer) {
    // Initialise our password policy
    var pwd = securePassword()
    var postPassHash = Buffer.from(preHashPass);

    // Register user
    pwd.hash(postPassHash, function(err, hash) {
      if (err) throw err
      // Save hash somewhere
      console.log('Form Password Hashed:');
      console.log(hash);

      pwd.verify(postPassHash, hashFromDatabaseBuffer, function(err, result) {
        console.log('Verify Result: ');
        console.log(result);
        if (err) throw err
        if (result === securePassword.INVALID) {
          return res.render('index');
          return console.log('Imma call the cops')
          res.render('index');
        } else {
          if (result === securePassword.INVALID_UNRECOGNIZED_HASH) return console.error('This hash was not made with secure-password. Attempt legacy algorithm')
          if (result === securePassword.VALID) console.log('Yay you made it')
          if (result === securePassword.VALID_NEEDS_REHASH) {
            console.log('Yay you made it, wait for us to improve your safety')

            pwd.hash(hashFromDatabase, function(err, improvedHash) {
              if (err) console.error('You are authenticated, but we could not improve your safety this time around')

              // Save improvedHash somewhere
              hash = improvedHash;
            })
          }

          var verifiedHash = hash;
          console.log('verifiedHash: ');
          console.log(verifiedHash);

          //Give User Auth Token Here
          console.log('You Get an auth Token: ');
          res.render('studentDash');
        }

      }) // pwd.verify


    });
    pwd.hash
  }; // pass hash
})

module.exports = router;

来自服务器的控制台输出 (注意密码是虚拟数据)

控制台输出

[nodemon] starting node ./bin/www 
GET /LogoWithLayersTiny.png 304 1.124 ms - - 
in Login Route 
In Query User; 
test 
Database Returned User: bb 
Database Returned Password: "HashParametersRemoved"$WItArkxi20QeSHlGhUK2lQ$PY74Axv6cOvFD‌​FiHmZ6EwT0RMgLkDOb1W‌​6CVBssE1tk 
Do I get here?

【问题讨论】:

  • 无法包含控制台输出,因为它的格式不正确并且无法编辑帖子。包括控制台输出:` [nodemon] starting node ./bin/www GET /LogoWithLayersTiny.png 304 1.124 ms - - 在登录路由中查询用户;测试数据库返回用户:bb 数据库返回密码:“HashParametersRemoved”$WItArkxi20QeSHlGhUK2lQ$PY74Axv6cOvFDFiHmZ6EwT0RMgLkDOb1W6CVBssE1tk 我到这里了吗?;`

标签: javascript node.js module routes return


【解决方案1】:

我认为你只需要在 databaseLoginUser.js 中调用 callback 来传递数据。 像这样的:

// databaseLoginUser.js

var express = require('express');
var router = express.Router();
var mysql = require('mysql');

module.exports.getModuleFunction = function (userName, callback) {
    queryUser(userName);
    function queryUser(userName) {
        console.log('In Query User; ');
         var database = mysql.createConnection({
            host: "xxx.xxx.xxx.xxx",
            port: "3306",
            user: "UserName",
            password: "Password",
            database: "Students",
            multipleStatements: true
        });

        database.connect();

        database.query('SELECT StudentUsername, StudentPassword FROM STUDENT WHERE StudentUsername = ?', userName, function (err, rows, fields) {
            if (err) { console.log(err); }
            console.log('Database Returned User: ' + rows[0].StudentUsername);
            console.log('Database Returned Password: ' + rows[0].StudentPassword);
            var hashFromDatabaseBuffer = Buffer.from(rows[0].StudentPassword);
            callback(hashFromDatabaseBuffer); // This call.
        });
    }
};

【讨论】:

  • 谢谢,我会更新的。这是有道理的,因为缓冲区调用需要一些时间才能返回。
  • 哇,谢谢。这简直就是这么简单。我可能会进行一些更改以使代码更清晰,但这会使主登录模块变得不那么单一!希望这将有助于其他希望制作更多模块化代码的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2017-06-27
相关资源
最近更新 更多