Я создаю веб-приложение, которое работает на Node и использует фреймворк Express.
В проекте у меня есть два модуля, CreateAccountService.js
и LoginService.js
в каталоге "service".
На данный момент каждый модуль имеет только одну функцию в своем экспорте.
В случае модуля CreateAccountService.js
его экспортируемая функция называется create
, а в случае Модуль LoginService.js
, его экспортируемая функция называется login
.
По чистому совпадению оба эти модуля содержат вспомогательную функцию с именем validateCredentials
. Также по стечению обстоятельств обе эти вспомогательные функции принимают два параметра. Но на этом сходство заканчивается. validateCredentials
, определенный в CreateAccountService.js
, используется для проверки сложности пароля и форматирования электронной почты, тогда как ValidateCredentials
, определенный в LoginService.js
, используется для подтверждения проверки базы данных, чтобы убедиться, что у пользователя есть учетная запись. пароль и т. д. c.
Вот где это становится странным. Когда create
вызывает validateCredentials
, он вызывает функцию, определенную в своем собственном модуле, как я и ожидал. ОДНАКО, когда login
вызывает validateCredentials
, он как-то вызывает функцию, определенную в CreateAccountService.js
, вместо вызова метода, определенного в своем собственном файле, LoginService.js
.
В чем здесь дело? В обоих модулях их соответствующая функция validateCredentails
НЕ экспортируется. Кроме того, ни один из неисправных модулей (LoginService.js
и CreateAccountService.js
) «не требует» другого.
Разве не должно быть абсолютно невозможно, чтобы один модуль вызывал метод, определенный в другом модуле, если только этот метод экспортируется?
Что я делаю не так? Кажется глупым убедиться, что каждое имя функции во всем моем проекте имеет уникальное имя.
Ниже приведен мой код с удаленными или закомментированными несущественными частями.
LoginService. js
var debug = require('debug')('app:LoginService');
var moment = require('moment');
const adminDAO = require('../data_access/AdminDAO.js');
const authDAO = require('../data_access/AuthDAO.js');
const authModel = require('../models/AuthModel.js');
login = function(json, next) {
validateCredentials(json, function(adminID, err) {
if (err) {
next(null, err);
} else {
deleteExistingAuth(adminID, function() {
createSession(adminID, function(token) {
next(token, null);
});
});
}
});
}
//This method is never called for some reason...
validateCredentials = function(credentials, next) {
/*
Validates credentials against data stored in the database...
*/
}
exports.login = login;
CreateAccountService. js
const adminDAO = require('../data_access/AdminDAO.js');
const adminModel = require('../models/AdminModel.js');
const authDAO = require('../data_access/AuthDAO.js');
create = function(json, next) {
admin = new adminModel(json["firstName"], json["lastName"], json["password"], json["email"]);
validAdmin(admin, function(err) {
if (err) {
next(err);
} else {
checkDuplicates(admin, function(err2) {
if (err2) {
next(err2);
} else {
addAdmin(admin, next);
}
})
}
});
}
validAdmin = function(admin, next) {
if (admin._firstName &&
admin._lastName &&
admin._passwordHash &&
admin._email) {
validateCredentials(admin, next);
} else {
err = new Error("Missing one or fields! First name, last name, password, and email are all required!")
next(err);
}
}
//This function is called by the "create" method in this module (as it should)
//AND is called by the "login" function in the other module (which it should not)
validateCredentials = function(admin, next) {
/*
makes sure that password meets complexity requirements
and that the email is a valid email format
*/
}
exports.create = create;
admin. js (Это файл, который вызывает create
или login
в зависимости от заданного c маршрута )
const express = require('express');
const router = express.Router();
const loginService = require('../service/LoginService.js');
const createAccountService = require('../service/CreateAccountService.js');
router.post('/signup', function(req, res) {
createAccountService.create(req.body, function(err) {
if (err) {
res.send(responseFromError(err));
} else {
obj = {
"status":"success"
}
res.send(JSON.stringify(obj));
}
});
});
router.post('/login', function(req, res) {
console.log("Hitting the login route");
loginService.login(req.body, function(authToken, err) {
if (err) {
res.send(responseFromError(err));
} else {
obj = {
"status":"success",
"authToken":authToken
};
res.send(JSON.stringify(obj));
}
});
});
module.exports = router;