簡體   English   中英

Node.js 從一個模塊傳遞變量/對象並返回它

[英]Node.js pass variable/object from one module and return it

我正在使用node.js express 框架,最初在一個路由文件中編寫了獲取數據庫密碼/哈希和比較表單密碼/哈希。 現在我想通過一個userName一個單獨的模塊。 該模塊應該接受一個userName並從數據庫中返回相應的密碼/哈希值。

在將函數分解為它們自己的模塊之前,我們返回哈希並將其傳遞給下一個函數 ( passHash ),代碼運行得很好。 現在我已經將函數與 db 調用分開了,我無法弄清楚如何將散列返回到原始函數。

將函數分解為兩個單獨的文件后,我可以成功地將userName傳遞給數據庫模塊(它控制台記錄username / hash ),但我無法將用戶的密碼/哈希返回到原始路由中的原始函數。 我已經閱讀了許多關於如何使用require將“OR”返回變量/對象從一個模塊傳遞到另一個模塊的帖子,但沒有關於如何傳遞變量“AND”返回 post 函數數據。

以下是我在創建這些文件時參考的一些資源

1.) 接受的答案很容易理解(這是我使用的模型)

2.) 高級

3.) 示例大多數答案顯示了一種返回函數

4.) 似乎有答案

此外,我嘗試過以多種方式返回密碼/哈希值; 創建一個對象並返回屬性。 返回對象,並將對象分配給變量並提取類似於上面鏈接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?

我認為您只需要在傳遞數據的 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.
        });
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM