如何让Nodemailer触发独立.js脚本生成新随机数?
问题解决:每次发送邮件生成新随机数
你的问题出在Node.js的模块缓存机制上:服务器启动时你就require('./randomnum.js')并把生成好的随机数赋值给number变量,这个值只会在启动时生成一次,后续所有请求都会复用同一个随机数,不会重新生成。
下面是两种可行的解决方法:
方法一:修改randomnum.js导出函数(推荐)
这种方式最符合Node.js模块设计的最佳实践,直接导出生成随机数的函数,每次需要时调用函数获取新值。
修改randomnum.js:
function randomnumber() { return Math.floor(100000 + Math.random() * 900000); } // 导出函数而非生成好的数值 exports.randomnumber = randomnumber;
然后修改myserver.js:
- 移除提前赋值的
number变量,只保留模块引用:
var randomnum = require('./randomnum.js'); // 删掉这行:var number = randomnum.number;
- 在
/mail的POST请求回调里,每次调用函数生成新随机数:
app.post('/mail', (req, res)=>{ console.log(req.body) // 每次请求时生成新的随机数 let number = randomnum.randomnumber(); // 后续的nodemailer代码保持不变,继续使用这个number变量 let transporter = nodemailer.createTransport({...}); // ... 其余代码 })
方法二:清除模块缓存后重新加载(不推荐)
如果不想修改randomnum.js,可以在每次请求时清除该模块的缓存,再重新require,强制重新执行模块代码生成新随机数。但这种方式会破坏Node.js的模块缓存优化,性能和维护性都不如方法一。
修改myserver.js的POST请求回调:
app.post('/mail', (req, res)=>{ console.log(req.body) // 清除randomnum.js的模块缓存 delete require.cache[require.resolve('./randomnum.js')]; // 重新加载模块,此时会重新执行randomnum.js里的代码生成新随机数 let randomnum = require('./randomnum.js'); let number = randomnum.number; // 后续nodemailer代码保持不变 let transporter = nodemailer.createTransport({...}); // ... 其余代码 })
推荐优先使用方法一,代码结构更清晰,也更符合Node.js的运行机制。
内容的提问来源于stack exchange,提问作者Naizey_lines
相关产品推荐
相关产品推荐

