这是我参与「第四届青训营 」笔记创作活动的第9天。
以下是在写仿掘金官网NodeJS服务器的时候遇到的一些问题还有相关的解决方案。
axios接受数据
axios会自动将接收到的JSON数据解析,自动执行JSON.parse()操作
关于axios发送数据会出现跨域(CORS)这一问题
原因:
-
服务器未设置可以跨域,设置跨域即可
router.post('/data/home', urlencodedParser, function (req, res, next) { //设置所有域名都可以通过 res.setHeader("Access-Control-Allow-Origin", "*"); } -
两者的传参格式不同
axios的传参格式为application/json:JSON数据格式
我们需要将它转换为:application/x-www-form-urlencoded:form-data格式发送到服务器
比如:
{name:"zhangsan",age:10}需要改为
name="zhangsan"&age=10注意:nodejs的post默认为application/x-www-form-urlencoded
代码如下:
var urlencodedParser = bodyParser.urlencoded({ extended: false }); router.post('/data/home', urlencodedParser, function (req, res, next) { //接收post请求 }
相关文章的接口
使用随机数写出的相关文章
//相关文章接口
router.get('/data/correlation', function (req, res, next) {
res.setHeader("Access-Control-Allow-Origin", "*");
let index = 0;
let article = [];
fs.readFile('./public/text/home.json', function (err, data) {
let data1 = JSON.stringify(data);
for (let i = 0; i < 5; i++) {
index = Math.floor(Math.random() * 30);
//避免小概率事件,30的出现
if (index === 30) {
index = 29;
}
article[i] = data1[index];
}
res.send(JSON.stringify(article));
})
})
对接口的约束
返回错误是接口必须的,可以同时帮助客户端和服务端发现一些问题,包括也谢4xx客户端错误以及5xx服务端错误等等。
这个可以简单的解释为发送400等拒绝请求的方式以及对请求格式的判断,代码如下
router.post('/data/article', urlencodedParser, function (req, res, next) {
res.setHeader("Access-Control-Allow-Origin", "*");
let index = req.body.index;
let reason = {
"error": "未能提供所给参数或参数错误"
}
if (index == '' || index == undefined || index == null) {
res.statusCode = 400;
res.send(reason);
res.end();
} else {
fs.readFile('./public/text/article.json', function (err, data) {
if (err) {
throw err;
} else {
let data1 = JSON.parse(data);
fs.readFile('./public/text/home.json', function (err, data) {
let data2 = JSON.parse(data);
data1[index].information = data2[index];
res.send(JSON.stringify(data1[index]));
})
}
})
}
})
第七行对请求body内index的值进行判断,如果没有或者为空就返回400,这样就使得数据更安全、可以有效防止信息泄漏。