Node.js передает переменную / объект из одного модуля и возвращает его

1

Я использую node.js express framework и изначально написал пароль базы данных get/hash и сравнивал форму password/hash в одном файле маршрута. Теперь я хочу, чтобы передать userName в отдельный модуль. Модуль должен принять userName и возвращает соответствующий пароль/хэш из базы данных.

Прежде чем разбить функции на свои собственные модули, мы возвращаем хеш и передаем его следующей функции (passHash), и код работает нормально. Теперь, когда я отделил функции от вызовов db, я не могу понять, как вернуть хэш обратно в исходную функцию.

С помощью функций вспыхнувших на две отдельные файлы, я могу успешно пройти userName к модулю базы данных (это консоль регистрирует username/hash), но я не могу вернуть пароль пользователя/хэша обратно к исходной функции в исходном маршруте. Я читал много постов о том, как использовать require передать "ИЛИ" возвращают переменные/объекты из одного модуля к другому, но ничего о том, как передать переменную "И" возвращает данные после функции.

Вот некоторые из ресурсов, с которыми я консультировался при создании этих файлов

1.) Принятый ответ был легко следовать (это модель, которую я использовал)

2.) Продвинутый

3.) Пример большинства ответов показывает одну функцию возврата пути

4.) Кажется, есть ответ

Кроме того, я попытался вернуть пароль/хэш в нескольких вариантах; Создайте объект и верните свойства. Верните объект и назначьте объект переменной и извлеките свойство, похожее на ссылку 4 выше.

Ниже приведены:

1.) Функция модульной базы данных (databaseLoginUser.js)

2.) Исходный маршрут, который вызывает функцию Modularized (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?
  • 0
    Не удалось включить вывод консоли, поскольку он был неправильно отформатирован и не может редактировать сообщение. Включая консольный вывод здесь: `[nodemon] начальный node ./bin/www GET /LogoWithLayersTiny.png 304 1,124 мс - - в Route In Query User; test Database Returned Пользователь: bb Database Returned Password: "HashParametersRemoved" $ WItArkxi20QeSHlGhUK2lQ $ PY74Axv6cOvFDFiHmZ6EwT0RMgLkDOb1W6CVBssE1tk Получу ли я здесь?; `
Теги:
module
routes
return

1 ответ

1
Лучший ответ

Я думаю, вам просто нужно вызвать callback в databaseLoginUser.js, передавая данные. Что-то вроде этого:

// 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.
        });
    }
};
  • 0
    Спасибо буду обновлять. Это имеет смысл, поскольку возврат буфера займет некоторое время.
  • 0
    Вау, спасибо. Это было буквально так просто. Я могу внести некоторые изменения, чтобы сделать код чище, но это делает основной модуль входа намного менее монолитным! Надеюсь, это поможет другим, желающим создать более модульный код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню