这是我参与「第四届青训营 」笔记创作活动的第7天。
以下是在写仿掘金官网NodeJS服务器的时候遇到的一些问题还有相关的解决方案。
随机数的截取公式
如果我们想要获得一个(a,b)范围的随机数,那我们可以使用以下代码来获取:
let rand=Math.random*(b-a)+a;
因为Math.random给出的随机数为(0,1),例如:我们想要获得一个(25,625)范围的随机数就可以使用以上代码进行代换。
let rand=Math.random*(625-25)+25;
这样,我们就可以得出指定范围的随机数了
关于在遍历的过程中使用同一个对象等引用数据类型会导致的问题
说实话,这个问题的确有点痛心疾首了。
在写服务器的过程中,我想通过遍历将收集来的md文件中的内容变成字符串存放在json文件中,使用data222这个数组作为中间值,但是,当我运行程序后,data222中的每一个元素都是相同的,这就很难受了,最后才发现是对象指向的问题
我们来看如下代码:
let data222 = [];
let article = {
author: "掘金",
name: "",
essay: "",
category: "",
goodtext: "",
time: "",
browse: 0,
like: 0,
comments: 0,
collect: 0
}
fs.readdir(process.cwd() + '/biji/', (err, files) => {
console.log(process.cwd() + '/biji/');
for (let i = 0; i < files.length; i++) {
fs.readFile(process.cwd() + '/biji/' + files[i], (err, data) => {
if (err) {
throw err;
} else {
//作者名字
//文章数据:data
let essay = data.toString();
article.essay = essay;
//文章名字
let item1 = files[i].split(".");
let name = item1[0];
article.name = name;
//分类标签
let category = '';
article.category = category;
//文章优选内容截取
let origintext = data.toString();
let goodtext = origintext.replace(/[#*`]/g, '').replace(/[^a-z''! 。,.0-9\u4e00-\u9fa5A-Z]/g, '').substring(0, 200);
article.goodtext = goodtext;
//时间
let time = Math.floor(Math.random() * (2170 - 5) + 5);
let time1 = "";
//判断时间给出具体时间数据
if (time >= 0 && time < 24) {
if (time = 0) {
time1 = 1 + "小时前";
} else {
time1 = time + "小时前";
}
} else if (time > 24 && time < 720) {
time1 = Math.floor(time / 24) + "天前";
} else if (time >= 720) {
time1 = Math.floor(time / 720) + "月前";
}
article.time = time1;
//给出随机浏览数
let browse = Math.floor(Math.random() * (3000 - 186) + 186);
article.browse = browse;
//给出随机点赞数
let like = Math.floor(Math.random() * 50);
article.like = like;
//评论:0
let comments = 0;
article.comments = comments;
//收藏:0
let collect = 0;
article.collect = collect;
console.log(article.browse);
let index = data222.length;
data222[index] = article;
}
})
}
})
以及另外一个代码片段:
let data222 = [];
fs.readdir(process.cwd() + '/biji/', (err, files) => {
console.log(process.cwd() + '/biji/');
for (let i = 0; i < files.length; i++) {
fs.readFile(process.cwd() + '/biji/' + files[i], (err, data) => {
let article = {
author: "掘金",
name: "",
essay: "",
category: "",
goodtext: "",
time: "",
browse: 0,
like: 0,
comments: 0,
collect: 0
}
if (err) {
throw err;
} else {
...
//与上面代码相同
}
})
}
})
两段代码唯一的不同就是,将article对象由全局对象转化成了局部对象,这也意味着程序每遍历一次就会创建新的对象,每个对象的地址都是不同的,但是,当我们将遍历所有的对象都指向article的全局变量,这就会导致一些问题的发生,比如,所有数组中的元素都相同等等。