Para enviar un correo electrónico, tengo un método de controlador como tal:
const send = function (subject, template, to, options) { // VSC says about "subject": is declared but its value is never read. // VSC does not say this for the other three parameters. return new Promise(function (resolve, reject) { fs.readFile(template, "utf8", function (err, templateContent) { if (err) { return resolve(false); } var subject = subject; console.log(subject); // this is where I do read "subject" but it returns 'undefined' // (even though I am passing the function a value for the parameter) ... etc
¿Qué estoy haciendo mal? En mi opinión, he declarado un subject
de parámetro y lo uso más adelante en el método del controlador.
var subject = subject;
var subject
crea una nueva variable, denominada subject
en el ámbito de la función de devolución de llamada pasada a readFile
.
Esto sombrea la variable de subject
creada como un nombre de parámetro para la función asignada para send
.
var subject = subject;
por lo tanto, copia el valor del subject
local (que no está undefined
en ese momento) al subject
(que no hace nada).
Dé a sus variables nombres diferentes incluso si hacen cosas similares.
Recomiendo el uso de un linter que puede hacer cumplir una regla como no-shadow (parece que ya está usando uno; VS Code no generará el mensaje de error, solo lo informará desde una herramienta que lo haga), así que asegúrese de activarlo. regla para esa herramienta).
var
dentro de la función se elevará a la parte superior, por lo que en tiempo de ejecución es:
fs.readFile(template, "utf8", function (err, templateContent) { var subject; // ... subject = subject; //undefined });
Simplemente use otro nombre para su tema anidado como _subject
y evite ensombrecer los nombres de las variables en general.