Object's Blog

11月踩坑记录(2020)

字数统计: 1.7k阅读时长: 6 min
2020/12/05 分享

前言

2020年的倒数第二个月,冲!

JavaScript数组去重

  • 问题描述

    过去数组去重时我通常都会在插入数据时判断数据是否存在于这个数组中,如果存在则不插入,如果不存在则插入,这种方式会比较损耗性能。

  • 解决方案

    ES6中提供了Set数据结构,天然去重。

    1
    2
    3
    function unique(arr){
    return Array.from(new Set(arr));
    }

前端向后端发送请求,无法请求到对应的方法,且后端返回html

  • 问题描述

    前端向后端发送数据时,无法正确被路由到对应的方法,且后端不正常返回JSON,只返回html。
  • 解决方案

    经过排查,发现是入参中包含一个int类型数据,但是前端表单收集数据时,如果没有填该字段,默认获取到的是"",这样会无法请求后端,但目前还不知道这个问题的原理。
    临时解决方案就是,使用javascript的delete,如果该参数没有值,则直接从入参对象中删除该参数。
    1
    2
    3
    4
       if(param.signOrder == null || param.signOrder==""){
    //如果param.signOrder传的是空,则需要删除该字段,避免造成无法请求后台的问题。
    delete param.signOrder;
    }

JavaScript修改url串中的参数

  • 问题描述

    业务需求,需要从一个url中,将请求参数修改掉。
  • 解决方案

    1
    2
    3
    4
    5
    6
     function replaceParamVal(oUrl,paramName,replaceWith) {
    var re=eval('/('+ paramName+'=)([^&]*)/gi');
    //新的url串
    var nUrl = oUrl.replace(re,paramName+'='+replaceWith);
    return nUrl;
    }

JavaScript删除url串中的参数

  • 问题描述

    业务需求,需要从一个url中,将请求参数删除。
  • 解决方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function removeUrlParam(url, ref){
    var str = "";
    //先判断这个url是否有参数
    if (url.indexOf('?') != -1)
    str = url.substr(url.indexOf('?') + 1);
    else
    return url;
    var arr = "";
    var returnUrl = "";
    //判断是多个参数还是单个参数
    if (str.indexOf('&') != -1) {
    //如果是多个参数,参数分离
    arr = str.split('&');
    for (var i in arr) {
    //判断ref是否和url中的参数是同名,如果不是,则不是要删除的,那么直接拼接到返回的url
    if (arr[i].split('=')[0] != ref) {
    returnUrl = returnUrl + arr[i].split('=')[0] + "=" + arr[i].split('=')[1] + "&";
    }
    }
    //拼接:url从开始到问号的那一部分+"?"+返回的url参数从开始到参数-1的位置(删除最后一个&)
    return url.substr(0, url.indexOf('?')) + "?" + returnUrl.substr(0, returnUrl.length - 1);
    }
    else {
    //如果是单个参数,就判断一下要删除的参数是不是这个参数,如果不是直接返回原url,如果是,则截取0到问号的url返回
    arr = str.split('=');
    if (arr[0] == ref)
    return url.substr(0, url.indexOf('?'));
    else
    return url;
    }
    }

IDEA DEBUG无法启动

  • 问题描述

    IDEA ,debug的时候无法正常启动,报错端口已经被占用。

    IDEA报错

  • 解决方案

    先查看被占用的端口号是多少,我这里是1099,然后去cmd中运行netstat -ano|findstr 1099,找到占用该端口的进程,使用taskkill -f 进程号命令终止该进程,然后重新启动IDEA的debug即可。

    终止进程

通过rpmbuild将源码包制作成为rpm包

  • 问题描述

    学习如何使用rpmbuild工具将源码包制作成rpm包。

  • 解决方案

    1. 安装rpmbuild

      1
      2
      3
      $yum install rpmbuild
      $yum install rpmdevtools
      $rpmdev-setuptree
    2. 查看是否安装成功

      1
      rpmbuild --showrc | grep topdir
    3. 进入rpmbuild 目录文件夹如下:

      1
      BUILD BUILDROOT RPMS SOURCES SPECS SPRAMS

      rpmbuild各目录作用

    4. 将源码包中的.spec文件放到SPECS目录中,如果没有该文件,可以遵照网上的教程自己写一个。

    5. 将源码包放到SOURCES目录中。

    6. 使用rpmbuild -ba spec文件命令,进行编译,编译好的rpm包会放在RPMS目录下,就可以直接进行安装了。

    7. 分享rpmbuild的各种参数

      1
      2
      3
      4
      5
      6
      7
      8
      rpmbuild  
      -ba 既生成src.rpm又生成二进制rpm
      -bs 只生成src的rpm
      -bb 只生二进制的rpm
      -bp 执行到pre
      -bc 执行到 build段
      -bi 执行install段
      -bl 检测有文件没包含

无root权限安装FastDFS

  • 问题描述

    工作项目使用FastDFS,由于是源码包,需要使用root用户编译并安装,但是客户现场没有拿不到root用户,并且规定不能安装gcc。

  • 解决方案

    接到这个问题时,其实我是一脸懵逼的,因为从来没有遇到过这种问题,即使我们可以将fastdfs编译好给他,但是fastdfs所依赖的库是libfastcommmon.so,这个是需要放在/usr/bin目录下的,这个也是需要root权限的。不过还好最终还是解决了。

    刚开始的思路是,把源码包通过rpmbuild工具,打包成rpm包,libfastcommmon也打成rpm包,但是rpm包安装也是需要root的,并且我试过重定向安装rpm,发现fastdfs和libfastcommon均无法重定向,所以这个方法无法解决,先记下命令吧

    1
    rpm -ba .spec文件

    然后发现这个打包的过程,实际上就是将源码包进行编译,再通过某种方式打包成rpm,那我为什么不自己编译二进制包呢?

    我再rpmbuild的BUILDROOT目录下,发现了生成rpm包的中间产物,也就是编译好的fastdfs项目,于是直接将其取出,但是此时是无法运行的,因为还没有安装libfastcommon,于是使用make将libfastcommon进行编译,在src目录下生成了一个libfastcommon.so,也就是最后fastdfs依赖的动态链接库。那么现在就剩下一个问题,如何让其在没有root权限的状况下,进入到/usr/bin目录下。

    这是根本不可能的,所以需要换一种思路,我是这么做的,将其放到一个任意的目录下,然后让fastdfs自己去找这个libfastcommon,说起来容易做起来难,我当时想的是修改源码,但是这种方法显然工作量太庞大了,最终发现一种方法可以完美解决,我将libfastcommon.so放到自己新建的一个目录下,然后通过修改LIB_LIBRARY_PATH,达到想要的效果:

    export LD_LIBRARY_PATH = ~/lib

    然后将libfastcommon.so文件权限修改为755。

    FastDFS完美启动,但是这种做法,需要启动fastdfs在指定配置文件时,需要写配置文件的绝对路径,否则启动报错。

    注意:必须使用和需要安装该软件的机器的同一个操作系统版本进行编译,否则libc会不支持。

div宽度随文字长度自适应

  • 问题描述

    div宽度限制,文字长度变长后,会被挤到下一行。
  • 解决方案

    css3提供了完美的解决方案
    1
    2
    3
    width:fit-content;
    width:-webkit-fit-content;
    width:-moz-fit-content;

结语

时间真的过的太快,2020年就像是做了一场梦。

原文作者:Object

原文链接:http://blog.objectspace.cn/2020/12/05/11月踩坑记录(2020)/

发表日期:2020 December 5th, 8:29:14 pm

更新日期:2020 December 5th, 9:20:41 pm

版权声明:未经作者授权请勿转载

目录
  1. 1. 前言
  2. 2. JavaScript数组去重
    1. 2.1. 问题描述
    2. 2.2. 解决方案
  3. 3. 前端向后端发送请求,无法请求到对应的方法,且后端返回html
    1. 3.1. 问题描述
    2. 3.2. 解决方案
  4. 4. JavaScript修改url串中的参数
    1. 4.1. 问题描述
    2. 4.2. 解决方案
  5. 5. JavaScript删除url串中的参数
    1. 5.1. 问题描述
    2. 5.2. 解决方案
  6. 6. IDEA DEBUG无法启动
    1. 6.1. 问题描述
    2. 6.2. 解决方案
  7. 7. 通过rpmbuild将源码包制作成为rpm包
    1. 7.1. 问题描述
    2. 7.2. 解决方案
  8. 8. 无root权限安装FastDFS
    1. 8.1. 问题描述
    2. 8.2. 解决方案
  9. 9. div宽度随文字长度自适应
    1. 9.1. 问题描述
    2. 9.2. 解决方案
  10. 10. 结语