[英]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 函數數據。
以下是我在創建這些文件時參考的一些資源
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$PY74Axv6cOvFDFiHmZ6EwT0RMgLkDOb1W6CVBssE1tk
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.