gpt4 book ai didi

javascript - Node 意外地从另一个模块调用同名函数

转载 作者:行者123 更新时间:2023-12-01 00:04:35 24 4
gpt4 key购买 nike

我正在创建一个在 Node 上运行并使用 Express 框架的 Web 应用程序。

在项目中,我有两个模块,CreateAccountService.jsLoginService.js在“服务”目录中。

目前,每个模块的导出中只有一个函数。

CreateAccountService.js为例模块,其导出函数名为create ,在 LoginService.js 的情况下模块,其导出函数名为login .

纯属巧合,这两个模块都包含一个名为 validateCredentials 的辅助函数。 。同样纯属巧合的是,这两个辅助函数都接受两个参数。但相似之处仅此而已。 validateCredentials定义于 CreateAccountService.js用于检查密码复杂性和电子邮件格式,而 ValidateCredentials定义于 LoginService.js用于确认检查数据库以确保用户确实拥有帐户、提供了正确的密码等。

这就是事情变得奇怪的地方。当create来电 validateCredentials ,它调用在自己的模块中定义的函数,正如我所期望的那样。然而,当 login来电 validateCredentials ,它以某种方式调用 CreateAccountService.js 中定义的函数LoginService.js 而不是调用在其自己的文件中定义的方法.

这是怎么回事?在这两个模块中,它们各自的 validateCredentails函数未导出。此外,两个有问题的模块( LoginService.jsCreateAccountService.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(这是根据具体路由调用 createlogin 的文件)

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;

最佳答案

login = function(json, next) {

您将函数分配给从未声明的变量,这使它们成为隐式全局变量(当您将新值分配给同名的全局变量时,您将覆盖现有的变量)。

使用 const(或 letvar)声明它们,以便将它们限定在模块范围内。

"use strict"; 启动每个模块禁止隐式全局变量和其他被认为有风险的旧 JS 功能。

关于javascript - Node 意外地从另一个模块调用同名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60470548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com