Я использую node.js
express framework и изначально написал пароль базы данных get/hash и сравнивал форму password/hash в одном файле маршрута. Теперь я хочу, чтобы передать userName
в отдельный модуль. Модуль должен принять userName
и возвращает соответствующий пароль/хэш из базы данных.
Прежде чем разбить функции на свои собственные модули, мы возвращаем хеш и передаем его следующей функции (passHash
), и код работает нормально. Теперь, когда я отделил функции от вызовов db, я не могу понять, как вернуть хэш обратно в исходную функцию.
С помощью функций вспыхнувших на две отдельные файлы, я могу успешно пройти userName
к модулю базы данных (это консоль регистрирует username
/hash
), но я не могу вернуть пароль пользователя/хэша обратно к исходной функции в исходном маршруте. Я читал много постов о том, как использовать require
передать "ИЛИ" возвращают переменные/объекты из одного модуля к другому, но ничего о том, как передать переменную "И" возвращает данные после функции.
Вот некоторые из ресурсов, с которыми я консультировался при создании этих файлов
1.) Принятый ответ был легко следовать (это модель, которую я использовал)
2.) Продвинутый
3.) Пример большинства ответов показывает одну функцию возврата пути
Кроме того, я попытался вернуть пароль/хэш в нескольких вариантах; Создайте объект и верните свойства. Верните объект и назначьте объект переменной и извлеките свойство, похожее на ссылку 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$PY74Axv6cOvFDFiHmZ6EwT0RMgLkDOb1W6CVBssE1tk
Do I get here?
Я думаю, вам просто нужно вызвать 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.
});
}
};
node ./bin/www
GET /LogoWithLayersTiny.png 304 1,124 мс - - в Route In Query User; test Database Returned Пользователь: bb Database Returned Password: "HashParametersRemoved" $ WItArkxi20QeSHlGhUK2lQ $ PY74Axv6cOvFDFiHmZ6EwT0RMgLkDOb1W6CVBssE1tk Получу ли я здесь?; `