当前位置:   article > 正文

Nuxt.js asyncData()获取数据、nuxt反向代理跨域---05_nuxt asyncdata会跨域

nuxt asyncdata会跨域

在项目中需要在初始化页面前先得到数据服务器请求数据,也就是我们常说的异步请求数据。Nuxt.js贴心的为我们扩展了Vue.js的方法,增加了asyncData(){……}。从名字上就很好理解,这是一个异步的方法。

创建远程数据
在这里制作一些假的远程数据,我选择的网站是myjson.com,它是一个json的简单仓库,学习使用是非常适合的。我们打开网站,在对话框中输入JSON代码,这个代码可以自己随意输入哦。

  1. {
  2. "name": "名字",
  3. "age": 18,
  4. "interest": "I love coding!"
  5. }

输入后,网站会给你一个地址,这就是你这个JSON仓库的地址了。

https://api.myjson.com/bins/g5whc

安装Axios
Vue.js官方推荐使用的远程数据获取方式就是Axios,所以我们安装官方推荐,来使用Axios。这里我们使用npm 来安装axios。直接爱终端中输入下面的命令:

npm install axios --save

注意:由于asyncData方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。 

asynccData的promise方法
我们在pages下面新建一个文件,叫做ansyData.vue
然后写入下面的代码:

  1. <template>
  2. <div>
  3. <h1>姓名:{{info.name}}</h1>
  4. <h2>年龄:{{info.age}}</h2>
  5. <h2>兴趣:{{info.interest}}</h2>
  6. <p><nuxt-link to='/'>Home</nuxt-link></p>
  7. </div>
  8. </template>
  9. <script>
  10. import axios from 'axios'
  11. export default {
  12. data() {
  13. return {
  14. name: 'muzidigbig',
  15. }
  16. },
  17. /**
  18. * 后端请求
  19. * 1 在服务器端调用asyncData时,您可以访问用户请求的req和res对象。
  20. * 2 在当前页面刷新, 服务端执行此函数
  21. * 3 从其他页面跳转过来,客户端执行此函数
  22. */
  23. //方式一(await)
  24. // async asyncData(context) {
  25. // console.log(await axios.get('https://api.myjson.com/bins/1dkbio'))
  26. // let {data} = await axios.get('https://api.myjson.com/bins/1dkbio')
  27. // return出去的是data中的状态
  28. // return {info:data}
  29. // error(params)//当请求错误时直接跳转到错误页面(放在返回值之后)
  30. // },
  31. //方式二
  32. asyncData ({ params }) {//请求
  33. return axios({
  34. method: 'get',
  35. url: 'https://api.myjson.com/bins/1dkbio'
  36. })
  37. .then(function (response) {
  38. console.log(response.data)
  39. // return出去的是data中的状态
  40. return { info: response.data};
  41. error(params)
  42. })
  43. },
  44. }
  45. </script>

 请求方式一:

  1. asyncData ({ params }) {//请求
  2. return axios({
  3. method: 'get',
  4. url: '后台api接口'
  5. })
  6. .then(function (response) {
  7. // return出去的是data中的状态
  8. return { posts: response.data.slice(0, 5) }
  9. })
  10. },

 请求方式二:

  1. async asyncData ({ params }) {
  2. let { data } = await axios({
  3. method: 'get',
  4. url: '后台api接口'
  5. })
  6. // return出去的是data中的状态
  7. return { posts: data.slice(0, 5) }
  8. },

(1) 如果组件的数据不需要异步获取或处理,可以直接返回指定的字面对象作为组件的 数据。

        data():不需要考虑SEO、首屏渲染速度问题

  1. data() {
  2. return {
  3. dataList: ["1111", "2222", "3333"],
  4. list: null,
  5. };
  6. },

(2)使用 req/res(request/response) 对象 

初始化页面的时候用到的是服务器端请求数据,在浏览器上进行点击跳转页面是客户端请求数据。

asyncData()会被请求两次:第一次为服务端--有数据显示;第二次为客户端--更新数据

有益于SEO、首屏渲染

判断是在服务器端运行的请求还是客户端发送过来的请求: 

  1. /**
  2. * process全局变量
  3. * process.server==>Boolean是否在服务器端运行
  4. */
'
运行
  1. /**
  2. * 后端请求
  3. * 1 在服务器端调用asyncData时,您可以访问用户请求的req和res对象。
  4. * 2 在当前页面刷新, 服务端执行此函数
  5. * 3 从其他页面跳转过来,客户端执行此函数
  6. */
  7. asyncData ({ params }) {
  8. /**
  9. * process全局变量
  10. * process.server==>Boolean是否在服务器端运行
  11. */
  12. return axios({
  13. method: 'get',
  14. url: process.server ? 'https://api.myjson.com/bins/1dkbio':'/bins/1dkbio'
  15. })
  16. .then(function (response) {
  17. console.log(response.data)
  18. // return出去的是data中的状态
  19. return { info: response.data};
  20. error(params)
  21. })
  22. },

(3)错误处理

Nuxt.js 在上下文对象context中提供了一个 error(params) 方法,你可以通过调用该方法来显示错误信息页面。params.statusCode 可用于指定服务端 返回的请求状态码。 以返回 Promise 的方式举个例子:

  1. asyncData({ isDev, route, store, env, params, query, req, res, redirect, error }) {
  2. /**
  3. * process全局变量
  4. * process.server==>Boolean是否在服务器端运行
  5. */
  6. console.log(process.server);
  7. return axios({
  8. url: process.server
  9. ? "http://152.136.185.210:7878/api/hy66/home/data?type=pop&page=1"
  10. : "/api/hy66/home/data?type=pop&page=1",
  11. })
  12. .then((res) => {
  13. // console.log(res.data);
  14. // return出去的是data中的状态
  15. return {
  16. list: res.data.data.list,
  17. };
  18. })
  19. .catch((e) => {
  20. error({ statusCode: 404, message: "Post not found" });
  21. });
  22. },

 (4)反向代理的配置 (重启服务器)

  1. 1、安装
  2. npm install @nuxtjs/proxy -D
  3. 2、在 nuxt.config.js 配置文件中添加对应的模块,并设置代理
  4. modules:[
  5. '@nuxtjs/axios',//添加axios
  6. '@nuxtjs/proxy'//添加proxy模块
  7. ],
  8. axios:{
  9. proxy:true
  10. },
  11. proxy:{
  12. '/api':{
  13. target:'http://xxx.com',
  14. changeOrigin:true,
  15. pathRewrite:{
  16. '^/api':'/'
  17. }
  18. }
  19. }
  20. 3、重启
  21. 4、此时通过浏览器可以跨域,但后端请求时会因为路径问题报错
  22. 通过process.server/process.client来判断是前端还是后端请求
  23. process.server?url1:url2

如果上线了, 需要在node中配置好 http-proxy-middleware 就工作了。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号