我正在创建一个Node.js应用程序,它每6秒生成一个随机数,并通过API提供。
为了使数字生成逻辑不在API文件中,我将其封装在另一个文件中名为numberGen
的函数中。
api.js
const express = require("express");
const numberFactory = require("../numberGen.js");
module.exports = (function() {
let interval = 6, min = 0, max = 100;
const api = express.Router();
const numberGen = numberFactory({
interval, min, max
});
numberGen.run();
api.get("/Numbers/", (req, res) => {
res.json({ random: numberGen.currNum});
});
return api;
})();
numberGen.js
"use strict";
module.exports = function(args) {
let {
interval,
min,
max
} = args;
let currNumber = genRandom(min, max);
function run() {
setTimeout(() => {
currNumber = genRandom(min, max);
run();
}, interval);
}
function genRandom(min, max){
return Math.floor(Math.random() * max) + min;
}
return {
interval, currNumber,
run
};
};
理想情况下,客户端在0秒时发出请求,得到数字X,并在6秒后发出相同的请求,得到数字Y,因为服务器每6秒生成一个新的随机数。
这里的问题是客户端总是得到相同的数字,无论如何。
起初我认为这种情况正在发生,因为numberGen
正在返回一个永不改变的对象。为了解决这个问题,我尝试将一个数字从api.js
传递到生成器进行更新,但由于客户端总是获取一个空对象,所以它没有工作,因为serverNum === undefined
;
numberGen.js
"use strict";
module.exports = function(args) {
let {
interval,
min,
max,
serverNum
} = args;
serverNum = genRandom(min, max);
function run() {
setTimeout(() => {
serverNum= genRandom(min, max);
run();
}, interval);
}
function genRandom(min, max){
return Math.floor(Math.random() * max) + min;
}
return {
interval,
run
};
};
api.js
const express = require("express");
const numberFactory = require("../numberGen.js");
module.exports = (function() {
let interval = 6, min = 0, max = 100, serverNum;
const api = express.Router();
const numberGen = numberFactory({
interval, min, max, serverNum
});
numberGen.run();
api.get("/Numbers/", (req, res) => {
res.json({ random: serverNum});
});
return api;
})();
考虑到我想将此逻辑与api.js
文件分开,我该如何修复我的代码?
答案 0 :(得分:4)
您返回的对象在该特定时间点包含currNumber
的值 - 而非参考。添加一个函数,该函数返回数字的实际当前值,并调用该函数而不是numberGen.currNum
。
<强> numberGen.js 强>
module.exports = function(args) {
// add this function
function getNumber() {
return currNumber;
}
}
<强> api.js 强>
api.get("/Numbers/", (req, res) => {
res.json({ random: numberGen.getNumber()});
});
答案 1 :(得分:0)
或者您可以将代码简化为 的 api.js 强>
const express = require("express");
module.exports = (function() {
let interval = 6, min = 0, max = 100, serverNum;
const api = express.Router();
function genRandom(min, max){
return Math.floor(Math.random() * max) + min;
}
setInterval(function () {
serverNum=genRandom(min,max)
console.log(serverNum);
}, 6000);
api.get("/Numbers/", (req, res) => {
res.json({ random: serverNum});
});
return api;
})();