柯基

柯基 查看完整档案

绵阳编辑中央民族大学  |  计算机科学与技术 编辑绵阳市商业银行股份有限公司  |  前端工程师 编辑 weibo.com/u/2951954475 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

柯基 提出了问题 · 2020-12-24

pm2 彻底删除进程id

image.png

原来的进程删除后,并不会释放已用过的进程id,怎么彻底删除一个进程,让新启动的进程id从0开始呢?

关注 1 回答 1

柯基 提出了问题 · 2020-04-30

PWA js手动触发“将应用添加到主屏”?

在开发PWA应用时发现在用户首次进入网页时,sw加载正确,浏览器弹出了“添加应用到主屏”(A2HS)的提醒。但如果用户不小心点击了取消,并且不是使用的chrome等对PWA支持很好的手机浏览器,再要找到这个“添加应用到主屏”功能就很困难

在测试中发现,chrome手机浏览器在用户选择取消后,需要清除历史数据才能重新弹出A2HS提醒,如果客户选择安装随后卸载了,也需要清除历史数据才能弹出A2HS提醒,有些品牌手机自带的浏览器清除数据都不能触发,虽然chrome菜单自带“添加到主频幕”菜单,但其他浏览器并没有这个菜单

MDN的解释是:

如果用户选择“安装”,则将安装该应用程序(可作为独立的桌面应用程序使用),并且不再显示“安装”按钮(如果已经安装了该应用程序,则将不再触发onbeforeinstallprompt事件)。当您打开应用程序时,它将显示在其自己的窗口中。如果用户选择“取消”,则应用程序的状态将返回到单击按钮之前的状态。

这个提醒是一次性的吗?浏览器是以什么形式记录用户的选择的。有没有办法优化这个问题,通过js让浏览器忘记用户的选择,手动调起浏览器的A2HS提醒?

关注 1 回答 0

柯基 提出了问题 · 2020-04-23

Promise 可以递归吗

我有一个异步获取数据的方法:

getData: () => {
    return new Promise((resolve, reject) => {
        axios.get('/api/getData').then(res => {
            /* 存在下面两种可能返回 */
            /* 接口正确返回 */
            {
                status: 1,
                msg: '获取成功',
                data: {...}
            }
            /* 接口错误返回 */
            {
                status: 429,
                msg: '接口调用最大频次为1req/s'
            }
        })
    })
}

因为错误的返回是因为接口调用频次过高,所以就想如果返回429就等1秒后再重发请求:

getData: () => {
    return new Promise((resolve, reject) => {
        axios.get('/api/getData').then(res => {
            if (res.status === 1) {
                resolve(res.data)
            } else {
                reject()
            }
        })
    }).catch(() => {
        // 这里该如何写?
        // setTimeout(() => {
        //     getData().then()?
        // }, 1000)        
    })
}

请教一下如何在promise里写递归(也不完全叫递归,就是轮询,正确返回就跳出)啊?

关注 3 回答 3

柯基 提出了问题 · 2020-04-07

VS Code Remote-SSH 远程开发 webpack-dev-server不触发热更新了

如题,因为开发微信H5涉及到重定向跳转,域名直接指向到服务器的,所以想用VS Code最近很火的远程开发模式直接在远程服务器上开发,但现在有个问题,我远程修改了文件,按了Ctrl+S,但是Vue工程的dev服务并没有更新,准确说是没有反应。使用过webpack-dev-server热更新功能的小伙伴都知道,文件更新了,在shell上跑着的dev服务会有动态的更新。同样的工程,在本地就正常,但是在使用Remote-SSH的时候没有触发,很蒙。愿有知道的大神或者遇到过同样问题的伙伴指点一下,或者给个找出问题的方法也可以。感谢了!各工具版本如下:
服务器版本CentOS 8.0
Remote-SSH 0.51.0
webpack-dev-server 2.9.1

关注 2 回答 0

柯基 回答了问题 · 2019-11-12

解决mongoose查询怎么过滤某个字段?

find({},{b:0})

关注 2 回答 1

柯基 提出了问题 · 2019-11-11

mongodb populate 过后的查询问题

我有两个collection:
user:

let userSchema = mongoose.Schema({
  userid: String,
  name: String,
  avatar: String,
  mobile: String,
  roles: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Role'
  }]
}, {
  versionKey: false
})

let User = mongoose.model('User', userSchema)

和role:

let roleSchema = mongoose.Schema({
  name: String,
  nike: String
}, {
  versionKey: false
})

let Role = mongoose.model('Role', roleSchema)

现在有以下数据:

> db.user.find()
{
    "_id" : ObjectId("5dc371291c7f84365fa05eba"),
    "userid" : "suadmin",
    "name" : "超级管理员",
    "roles" : [ 
        ObjectId("5dc6767a1c7f84365fa0a377")
    ]
},
{
    "_id" : ObjectId("5dc681311c7f84365fa0a7c0"),
    "userid" : "lisi",
    "password" : "123456",
    "avatar" : "",
    "mobile" : "15652663001",
    "name" : "李四",
    "roles" : [ 
        ObjectId("5dc679301c7f84365fa0a4f1")
    ]
}
> db.roles.find()
{
    "_id" : ObjectId("5dc6767a1c7f84365fa0a377"),
    "name" : "超级管理员",
    "nike" : "suadmin"
},
{
    "_id" : ObjectId("5dc679301c7f84365fa0a4f1"),
    "name" : "普通用户",
    "nike" : "normal"
},
{
    "_id" : ObjectId("5dc79af38dd5e510e6ab0db7"),
    "name" : "评审员",
    "nike" : "checker"
}

然后我用populate role:

User.find().populate({
  path: 'roles',
  module: 'Role'
}).then(res => {
  console.log(res)
})
===>
{
    "_id" : ObjectId("5dc371291c7f84365fa05eba"),
    "userid" : "suadmin",
    "name" : "超级管理员",
    "roles" : [ 
        {
            "_id" : ObjectId("5dc6767a1c7f84365fa0a377"),
            "name" : "超级管理员",
            "nike" : "suadmin"
        }
    ]
},
{
    "_id" : ObjectId("5dc681311c7f84365fa0a7c0"),
    "userid" : "lisi",
    "password" : "123456",
    "avatar" : "",
    "mobile" : "15652663001",
    "name" : "李四",
    "roles" : [ 
        {
            "_id" : ObjectId("5dc79af38dd5e510e6ab0db7"),
            "name" : "评审员",
            "nike" : "checker"
        }
    ]
}

然后问题来了 我要怎么对populate后的数据过滤
比如我想找roles里有nike为checker的user
我这么查为什么没有结果:

 User.find().populate({
  path: 'roles',
  module: 'Role'
}).where('roles.nike').equals('checker')
.then(res => {
  console.log(res)
})
===>
[]

.where('roles.nike').equals('checker')写得有问题吗
有没有大佬提点一下,困扰一晚上了

关注 2 回答 1

柯基 赞了回答 · 2019-11-11

解决Vue多组件重复报错信息的优化问题

思路就是全局存个是否已经弹出过错误提示了,每次弹之前判断一下。

// 这行:
Message.error(error.response.data.msg);
// 改成:
const blockingKey = '_isAxiosMessageShowing';
if (sessionStorage.getItem(blockingKey) !== 'true') {
    sessionStorage.setItem(blockingKey, 'true');
    Message.error({
        content: error.response.data.msg,
        onClose: () => {
            sessionStorage.removeItem(blockingKey);
        }
    });
}

示例里用了 sessionStorage,至于你想用 vuex 还是挂载成 Vue 或 axios 的全局属性,随你意。

关注 1 回答 2

柯基 回答了问题 · 2019-11-11

解决Vue多组件重复报错信息的优化问题

采纳了 @然后去远足 大佬的答案,

case 401:
      // Message.error(error.response.data.msg)
      const msgKey = 'Error401Message'
      if (storage.get(msgKey) !== 'true') {
        storage.set(msgKey, 'true')
        Message.error({
          content: error.response.data.msg,
          onClose: () => {
            storage.remove(msgKey)
          }
        })
      }
      router.replace(`/login?next=${encodeURIComponent(location.hash.substr(1))}`)
      break

关注 1 回答 2

柯基 回答了问题 · 2019-11-11

vue项目支持markdown文件的展示,标题锚点

去研究下vuepress的源码看看vuepress是咋个实现的,用了哪些依赖,自己仿照看看能不能做

关注 3 回答 2

柯基 提出了问题 · 2019-11-11

解决Vue多组件重复报错信息的优化问题

image.png

先上图,大概情况就是这个样:

系统有多个组件,比如User组件主要控制用户信息的显示,需要调用获取用户数据的接口,主页面Main组件负责展示主要页面数据,也要调接口,页面上有个选择系统用户的组件,也要走接口获取数据,整个系统是通过JWT进行鉴权的,鉴权是以中间键的形式卸载在后端服务中的,所以有时候JWT过期了就会出现如图所示的情况。

多个组件多个接口都报错,就会出现多个error提示。

http工具用的axios,ui用的iview,有没有大佬有优化这个问题的思路,就是只用弹一个错误提示就行了,劳烦提点一下。

import axios from 'axios'
import storage from './storage'
import { Message } from 'iview'
import router from '@/router'

axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  config.headers.Authorization = 'Bearer ' + storage.get('token')
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  if (response.headers.authorization) {
    storage.set('token', response.headers.authorization.substr(7))
  }
  return response
}, function (error) {
  // 对响应错误做点什么
  switch (error.response.status) {
    case 401:
      Message.error(error.response.data.msg)
      router.replace(`/login?next=${encodeURIComponent(location.hash.substr(1))}`)
      break
    case 403:
      return Promise.resolve(error.response)
    default:
      return Promise.reject(error)
  }
})

export default axios
const jwt = require('jsonwebtoken')
const whiteList = [
  '/api/auth/login',
  '/api/auth/logout',
  '/api/auth/qrcode'
]
const config = require('../config')

module.exports = async (ctx, next) => {
  if (whiteList.indexOf(ctx.path) === -1) {
    // 验证jwt是否过期
    await jwt.verify(ctx.headers.authorization.substr(7), config.jwtSecret, async (err, decoded) => {
      if (err) {
        if (err.name === 'TokenExpiredError') {
          // token已过期,抛出401
          ctx.status = 401
          ctx.body = {
            code: '-1',
            msg: '登录状态已过期,请重新登录'
          }
        } else {
          ctx.status = 401
          ctx.body = {
            code: '-1',
            msg: 'token验证失败' + err.name,
            err: JSON.stringify(err)
          }
        }
      } else {
        ctx.user = decoded.user
        // 没有过期
        await next()
        // 重新签发一个新的token
        let token = jwt.sign({ user: decoded.user }, config.jwtSecret, {expiresIn: 600})
        ctx.set('Authorization', 'Bearer ' + token)
      }
    })
  } else {
    await next()
  }
}

关注 1 回答 2

认证与成就

  • 获得 1 次点赞
  • 获得 10 枚徽章 获得 0 枚金徽章, 获得 2 枚银徽章, 获得 8 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2017-07-18
个人主页被 348 人浏览