Узел случайно вызывает функции с тем же именем из другого модуля. - PullRequest
0 голосов
/ 01 марта 2020

Я создаю веб-приложение, которое работает на 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;

1 Ответ

2 голосов
/ 01 марта 2020
login = function(json, next) {

Вы присваиваете свои функции переменным, которые вы никогда не объявляете, что делает их неявными глобальными (и вы перезаписываете существующие, когда присваиваете новое значение глобальному объекту с тем же именем).

Объявите их с помощью const (или let или var), чтобы они были ограничены модулем.

Запустите каждый модуль с "use strict"; для запретить неявные глобальные переменные и другие старые JS функции, которые считаются рискованными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...