今天我们校的一个打acm的大佬突然找到我说要实现一些业务上的东西,问我可不可以用php搞定,大概说了一下业务逻辑后是一个基本的前后端功能,正好再扩展一下node的熟练度,也就接下来了,谁知道,主要功能半小时不到就写好了,谁知道一个跨域问题和不使用数据库存储搞了我一下午

基本需求

其实没什么好说的,就是后台+后端,三个接口,分别对应增加删除,查询,全部展示,写起来其实是很顺手的,如果node熟练以及基本后端配置(pm2)是很简单的,没想到给后来一下午忙活弄起了坑

大坑1:跨域CORS

这满满的搜索记录就是最好的证明

前端跨域问题是再正常不过的事情了,但是我要对一些csdn的垃圾文章吐槽,我前前后后找了许许多多,改来改去,最后是综合了java的后端配置改好的,你说气不气人,node的全都是一个复制一个,没一个对的

 
var app = express()
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
if (req.method == 'OPTIONS') {/*让option快速返回*/
res.sendStatus(200);
} else {
next();
}
});

不要问我为啥可以,应该是跟请求头有关,尤其是"Access-Control-Allow-Headers"比较重要,什么npm cors--save都不好用,记录一下以后备用

大坑2:不用数据库的数据存储

同学说怕数据库sql注入,让我不用数据库存储,我一想,这种key-value键值对mysql多好啊,可惜,然后我就傻傻的直接在node里初始化一个数组,存一个就push一个,查就是遍历存下标,可是一用就发现有问题了,要是重启一下数据不都没了吗,然后我就准备将数组作为文本写入到一个js文件里,然后发现fs.write对于直接写入js必须得用字符串,也就是说,需要使用"var message = ["+这种类似写字的操作,然后我尝试了,然后我失败了,可以写,但是没法操作,举例子就是我直接写字,一个字一个字去写入数据,一个字一个字去读出数据,没法打代码去操作数据,然后我就傻了,我想了想发现txt也是类似啊,天无绝人之路,我发现json这玩意不就是一个好的数据存储类型吗?果断操作起来。

/*现将json文件读出来*/
var data = fs.readFileSync('./data.json');
var file = data.toString(); /*将二进制的数据转换为字符串*/
file = JSON.parse(file); /*将字符串转换为json对象*/
/*将json写进去*/
var str = JSON.stringify(file); /*因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中*/
fs.writeFile('./data.json', str, function(err) {
if (err) {
console.error(err);
}
console.log('----------新增成功-------------');
})

 

 

就是二进制转为字符串,字符串转为json数组,json数组可以类似array进行一系列操作,然后在把json变回字符串,然后再写回json文件里,当然有个关于node.js的问题,node是异步进行,也就是说fs.readfile这种费时间的执行语句会在后台挂起,当整个程序执行完毕后再进行,这就让我判断出现了问题,它就是先返回后改变值,索性我调用了同步函数fs.readfilesync,这也就解决了问题

小总结

跨域可能到时候进入计算机学院后学习相关知识后再进一步学习,就这样吧,祝各位六一儿童节快乐呀嘿嘿嘿


浪子三唱,不唱悲歌