当前位置:   article > 正文

Vue2从0到1(五):使用nodejs+koa2和axios实现前后台数据通信

axios和js与koa交互
前面讲了环境的搭建用webpack打包vue,Vue-router,vuex的使用的使用以及Vue组件化及组件间传值
下面讲一下使用nodejs+koa提供接口,axios访问接口,前后端数据通信的相关内容。
11.使用nodejs+koa2提供后台接口

npm install koa koa-router --save-dev

在根目录下下新建server/index.js文件index.js:

  1. const Koa = require('koa');
  2. const router = require('koa-router')();
  3. const app = new Koa();
  4. router.get('/', (ctx, next)=> {
  5. ctx.response.body = '111'
  6. });
  7. app
  8. .use(router.routes())
  9. .use(router.allowedMethods());
  10. app.listen(3000,()=>{
  11. console.log('server is start at port 3000')
  12. });

package.json里面设置命令:"server":"node server index.js"
启动服务:npm run server
浏览器里面访问localhost/3000可看到返回值

12.设置koa允许前端跨域访问

使用koa2-cors设置跨域
安装npm install koa2-cors --save-dev

  1. ...
  2. app.use(cors({
  3. origin: function (ctx) {
  4. if (ctx.url === '/test') {
  5. return false;
  6. }
  7. return 'http://localhost:9001';
  8. },
  9. exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
  10. maxAge: 5,
  11. credentials: true,
  12. allowMethods: ['GET', 'POST', 'DELETE'],
  13. allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
  14. }));
  15. ...
13 使用axios访问后台接口

安装axios:

   npm install axios --save

在根目录新建server/request.js
封装一个request函数,所有的请求都通过request函数,便于对于请求统一处理

  1. export default {
  2. post(url, data) {
  3. return axios({
  4. method: 'post',
  5. baseURL: BASE_URL,
  6. url,
  7. data: JSON.stringify(data),
  8. timeout: 10000,
  9. headers: {
  10. 'X-Requested-With': 'XMLHttpRequest',
  11. // 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  12. 'Content-Type':"application/json",
  13. // 'Accept': 'application/json',
  14. // "charset":"utf-8"
  15. }
  16. }).then(
  17. (response) => {
  18. return checkStatus(response)
  19. }
  20. ).then(
  21. (res) => {
  22. return checkCode(res)
  23. }
  24. ).catch((e)=>{
  25. console.log(e)
  26. return new Promise((resolve, reject) => {
  27. reject(e);
  28. })
  29. })
  30. },
  31. get(url, params) {
  32. return axios({
  33. method: 'get',
  34. baseURL: BASE_URL,
  35. url,
  36. params, // get 请求时带的参数
  37. timeout: 10000,
  38. headers: {
  39. 'X-Requested-With': 'XMLHttpRequest'
  40. }
  41. }).then(
  42. (response) => {
  43. return checkStatus(response)
  44. }
  45. ).then(
  46. (res) => {
  47. return checkCode(res)
  48. }
  49. )
  50. }
  51. }

function checkStatus(response) {

  1. // loading
  2. // 如果http状态码正常,则直接返回数据
  3. if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {
  4. return response
  5. // 如果不需要除了data之外的数据,可以直接 return response.data
  6. }
  7. // 异常状态下,把错误信息返回去
  8. return {
  9. status: -404,
  10. msg: '网络异常'
  11. }

}

function checkCode(res) {

  1. // 如果code异常(这里已经包括网络错误,服务器错误,后端抛出的错误),可以弹出一个错误提示,告诉用户
  2. if (res.status === -404) {
  3. let vue = new Vue;
  4. vue.$message({ type: 'error', message:res.msg});
  5. }
  6. // if (res.data && (!res.data.success)) {
  7. // alert(res.data.error_msg)
  8. // }
  9. return res

}

  1. 调用:
  1. import request from '.././request.js';
  2. let {data} =await request.post(options.url,data1);
  3. let {data} =await request.get(options.url,data1);
  1. 请注意这里踩了两个坑:
  2. 1.设置axios.defaults.withCredentials = true //请求时带上cookie这样请求时才会带上cookie
  3. 2.设置'Content-Type':"application/json",并JSON.stringify(data),这样后台才能正确接收到数据
  4. 3.当设置请求时带上cookie时后端允许的跨域不能用"*"要说明协议+域名+端口[相关问题](https://segmentfault.com/q/1010000011878964?_ea=2792154)

请求数据效果图:图片描述

后面将讲一下element-ui的使用
代码托管于github 欢迎star
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/104415
推荐阅读
相关标签
  

闽ICP备14008679号