开始我使用asyncData的时候使用axios发送了请求,但是我在访问页面的时候一直显示connect ECONNREFUSED ::1:9001
我是在这里使用了封装的axios请求
async asyncData({params, app}) {
return vod.getPlayAuth(params.vid).then(response => {
return {
vid: params.vid,
playAuth: response.data.data.playAuth
}
})
},
// vod.js
import request from "@/utils/request";
export default {
// 根据视频id获取播放凭证
getPlayAuth(vid) {
return request({
url: `/eduvod/video/getPlayAuth/${vid}`,
method: 'get',
})
},
}
// @/utils/request
const service = axios.create({
baseURL: 'http://localhost:9001', // api的base_url
timeout: 40000 // 请求超时时间
})
在搜索资料的时候发现是因为框架无法连接到地址::1:9001
上的服务器,我在9001
端口配置了nginx作请求转发,我这时想可能是请求转发出了问题,所以我又手动调用了axios请求尝试直接访问本地服务的原始端口
async asyncData({params, error}) {
return axios.get(`https://localhost:8003/eduvod/video/getPlayAuth/${params.vid}`)
.then(res => {
return {
playAuth: res.data.data.playAuth,
vid: params.vid
}
})
},
这里我出现了一个更复杂的错误
搜索资料后发现我这里使用了https
请求头,但是我没有配置证书,我修改成http
之后代码可以正常运行了,所以现在问题就出现在nginx代理服务器上。
这时我又仔细看了看一开始错误提示,发现网站无法访问到的是 IPV6 回环地址上的9001端口,所以我猜想是不是nginx没有转发IPV6的请求,我搜索了一下相关资料发现果然是这样,然后我在nginx配置文件上加上了IPV6的回环地址,代码果然可以运行了!
server {
listen 9001; # 监听端口
listen [::1]:9001;
server_name localhost; # 主机名称
这时我还有疑问,之前在create()
回调函数里面发送的axios请求都可以正常转发,为什么这里就不行了呢,原来在异步请求中发送的请求是在Node.js
环境里进行发送的,而在Node.js
里面把请求地址里的localhost
解析成了::1
;而在create()
函数里的请求是在浏览器里进行发送的,在浏览器里把localhost
解析成了127.0.0.1
,这才导致了我在使用异步请求时出现了之前没有碰到的错误。