仿掘金官网经验(三)| 青训营笔记

81 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第9天。

以下是在写仿掘金官网NodeJS服务器的时候遇到的一些问题还有相关的解决方案。

axios接受数据

axios会自动将接收到的JSON数据解析,自动执行JSON.parse()操作

关于axios发送数据会出现跨域(CORS)这一问题

原因:

  1. 服务器未设置可以跨域,设置跨域即可

    router.post('/data/home', urlencodedParser, function (req, res, next) {
    	//设置所有域名都可以通过
      	res.setHeader("Access-Control-Allow-Origin", "*");
    }
    
  2. 两者的传参格式不同

    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,这样就使得数据更安全、可以有效防止信息泄漏。