《全栈导航》网站挂掉-我是如何排查问题

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 《全栈导航》网站挂掉-我是如何排查问题

问题



我突然发现,网站刷新的时候打不开了,如果是路由跳转进去,是正常的


但是网站常常链接会被别人收藏,或者直接分享打开,直接打不开肯定不好

image.png


问题分析:此网站我是采用的nuxt.js开发的,一般这种错误类型,通过网络请求的数据,然后在对象下的某属性丢失,造成错误类型

排查



通过检查,是在父级页面请求的数据,传到子组件数据丢失


page.js 页面


<template>
    <div class="aritcle-detail">
        <Header />
        <div class="wp clearfix">
            <Detail :detail="detail"></Detail>
        </div>
        <Footer />
    </div>
</template>
<script>
import { apiNavthemeDetail } from '@/api/navtheme'
import Detail from '@/web/article/Detail'
export default {
    components:{
        Detail
    },
    async asyncData({ $axios, app, store, params,route }) {
        console.log('router',params.id);
        const res = await apiNavthemeDetail({ id: params.id });
        return {
            detail: res.data,
            params
        }
    },
    mounted() {
         setTimeout(() => {
            console.log('params', this.params)
            console.log('detail', this.detail)
        }, 3000)
    }
}
</script>


Detail子组件


<template>
    <div class="detail">
        <div class="detail-left">
            <div class="info">
                <div class="header">
                    <h1>{{detail.title}}</h1>
                    <div class="meta">
                        <span>
                            {{detail.member.it_name}}次
                        </span>
                    </div>
                </div>
                <div class="user">
                    <div class="user-left">
                        <div class="img">
                            <img :src="detail.member.userhead" alt />
                        </div>
                        <div class="name">
                            <b>{{detail.member.username}}</b>
                            <span class="user-title">{{detail.member.description}}</span>
                        </div>
                    </div>
                </div>
                <div class="content article-md">
                    <no-ssr>
                        <mavon-editor
                            class="detail-md itnavs-markdown"
                            :value="detail['content']"
                            :subfield="false"
                            :defaultOpen="'preview'"
                            :toolbarsFlag="false"
                            :editable="false"
                        />
                    </no-ssr>
                </div>
            </div>
            <div class="community">
                <img src="@/assets/images/qzdh.jpg" alt />
            </div>
        </div>
    </div>
</template>
<script>
import Rightuser from './Rightuser'
import Casually from './Casually'
export default {
    components: {
        Rightuser,
        Casually
    },
    props: ['detail'],
}
</script>


查看服务器日志



nuxt.js 是node进程,启动的是用pm2,如有不懂,清查看我之前写的【文章】

pm2 logs


image.png


此处得出结论,认为是服务没有查找数据,我们查看服务端代码

public function detail(){
        $id = input('id');
        $navtheme = new NavthemeModel();
        $detail = $navtheme->where('id',$id)->with(['member'=>function($query){
            $query->field('it_name');
        },'taxonomic'=>function($query){
            $query->field('name,id,parentid');
            $query->with('primary');
        }])->find();
        $navtheme->where('id',$id)->inc('hits',1)->update();
        $detail['recommended'] = $navtheme->recommended();
        return $this->showWebData(['data'=>$detail]);
}


推测,$navtheme去查找时失败,未查找到相关数据,导致member类型空,那么在客户端前端写法


detail.member // 为undefined
detail.member.it_name // 报错,undefined 下面没有数据属性,导致nuxt.js异常


代码一直我未动过,为啥出现这种情况,不得奇解


经过排查,我尝试在这里,打印id


$id = input('id');
dump($id)


得出结论:null,那么问题找到了,也就会客户端穿过来的参数id,没有接受到,导致没有查询到数据


此时又有问题,前端和后端都是我写的,都跑了大半年没问题,怎么突然参数丢失了,为了验证,此刻我们可以查看nginx日志


nginx日志



通过宝塔面板可以查看到可视化查看nginx日志,当然也可以用命令行去查看,会更细致一些


image.png


经过排查在参数丢失

确认前端是否传入参数



async asyncData({ $axios, app, store, params, router }) {
    console.log('router ',router.id)
    console.log(params.id)
},


nuxt.js asyncData 函数是在服务端执行,所以在客户端是看不到的,需要在服务端看,我继续使用pm2 logs查看


image.png


结论:前端传递参数,后端没有接受到参数,在传输过程中丢失,前端使用的是用的axios.js

axios.js参数传输过程中丢失



首先确认axios.js版本,是否过于老旧


{
  "name": "nuxt-itnavs",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate"
  },
  "dependencies": {
    "axios": "^0.21.1",
  },
  "devDependencies": {
    "@nuxtjs/style-resources": "^1.0.0",
    "vue-img-cutter": "^2.1.10"
  }
}


再次回到,问题所在 我突然发现,网站刷新的时候打不开了,如果是路由跳转进去,是正常的,清看开头,意思是直接进来的有问题,路由跳转的没问题


在这个问题,需要搞懂nuxt.js的执行机制,nuxt.js主要解决了seo渲染问题,原理,先拿到数据,然后拼接成html模板,返回客户端,这样有了真实数据dom节点


我记得在axios.js 0.18之前的版本存在post参数丢失,参数传递了,后端接受不了,后来版本修复了此问题


Axios-中文文档


查看axios.js封装


// loca 其妙设计如果请求的过的数据直接取,不用发送请求
const post = async(url, params, hand = { loca: false }) => {
    if (process.server) {
        const res = await http.post(handLastUrl(url), params);
        return res.data;
    } else {
        let key = url.replace(/\//g, 'A');
        if (key && hand.loca && window[key]) {
            return window[key];
        }
        const res = await http.post(handLastUrl(url), params);
        if (hand.loca) {
            window[key] = res.data;
        }
        return res.data;
    }
}


通过排查由于axios默认发送数据时,数据格式是Request Payload,而并非我们常用的Form Data格式,PHP后端未必能正常获取到,所以在发送之前,需要使用qs模块对其进行处理

import qs from 'qs'; // 引用之前记得安装 npm i qs -S
http.post(handLastUrl(url), qs.stringify(params));


方法二


如果想快速解决问题, 把参数直接带在url,不过这种情况,最好放置一些类似id,数据比较少的数据进行传输


const apiTaxonomicItems = (params) => {
    return post(`${prefix}/taxonomic/items?id=${params.id}`, params)
}
export {
    apiTaxonomicItems,
}


修改后,打包后编译


npm run build // 客户端


打包完成后上传,.nuxt,static,nuxt.config.js,package.json,这四个文件


pm2 restart all // 服务端 pm2重启


此刻网站可以正常访问,详情页面刷新也都没问题,【全栈导航】

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
存储 自然语言处理 数据安全/隐私保护
微信公众号后台回复5s重试解决方案和思路
微信公众号后台回复5s重试解决方案和思路
333 0
|
6月前
|
小程序
微信小程序没有后台切换如何解决
微信小程序没有后台切换如何解决
|
2月前
|
Java 测试技术 程序员
「测试线排查的一些经验-上篇」&& 后端工程师
「测试线排查的一些经验-上篇」&& 后端工程师
17 1
|
7月前
|
监控 数据安全/隐私保护 iOS开发
服务器监控新利器:ServerBee带你看透服务器运行状态
服务器监控新利器:ServerBee带你看透服务器运行状态
173 0
|
7月前
|
监控 JavaScript C++
监控游戏c/c++的崩溃的解决方案
监控游戏c/c++的崩溃的解决方案
110 0
|
Web App开发 安全 前端开发
前端SameSiteCookie问题排查分享
近期排查客户上报的问题时,遇到了一个比较费解的问题,在这边梳理一下排查的流程、遇到的难点、找到的一些相关资料,来对整一个问题进行一个总结,也借此机会做一个分享SameSiteCookie相关的疑难问题处理
403 0
前端SameSiteCookie问题排查分享
|
缓存 网络协议 前端开发
业务前端界面报错504排查思路和解决办法
业务前端界面报错504排查思路和解决办法
业务前端界面报错504排查思路和解决办法
|
前端开发
前端项目实战134-前端实战项目部署线上刷新错误
前端项目实战134-前端实战项目部署线上刷新错误
86 0
|
Web App开发 运维 前端开发
【分享】前端线上紧急排查工具
【分享】前端线上紧急排查工具
365 0
【分享】前端线上紧急排查工具
|
运维 监控 前端开发
从零开始搞监控系统(7)——监控页面奔溃
  页面奔溃包含两种场景,第一种是浏览器在加载网页时遇到问题导致的奔溃,另一种是因为脚本渲染出错导致页面空白无内容的奔溃。