nodejs的koa传参校验的手搓

4 篇文章 0 订阅
第三方的有点搞不懂怎么写的,所以需要手搓一个来尝试一下

我的网站

场景说明:

像是下面这个中间件:

  /**
   * 对用户头像更改接口body中携带的必要参数进行校验
   * @param ctx
   * @param next
   * @returns {Promise<void>}
   */
  avatarUploadParams: async (ctx, next) => {
    const verifyRes = verify(ctx, {
      require: [{
        key: "friendId",
        type: String
      }]
    }, true);
    if (verifyRes.length >= 0) {
      userParamsError.result = verifyRes;
      ctx.body = userParamsError;
      return false;
    } else {
      await next();
    }
  }

你这里的中间件可能会有多个,那么你可以在第一个中间件的文件入口处进行参数校验:
example:

/**
 *
 * @param ctx
 * @param verifyObj{Object | Array} 需要校验的关键字
 * @param needToken{Boolean} 是否需要token
 * @returns {boolean|*[]}
 */
const verify = (ctx, verifyObj, needToken) => {
  const requireList = verifyObj.require;
  const result = [];
  if (requireList) {
    requireList.forEach(item => {
      // item 为string
      if (item.constructor === String) {
        if (!ctx.request.body[item]) {
          result.push(`缺少${item}参数`);
        }
      } else if (item.constructor === Object) {
        if (!ctx.request.body[item.key]) {
          result.push(`缺少${item.key}参数`);
        } else {
          try {
            if (((ctx.request.body)[item.key]).constructor !== item.type) {
              result.push(`${item.key}的类型错误`);
            }
          } catch (e) {
            console.log(e);
          }
        }
      }
    });
  }
  let token = "";
  if (needToken) {
    token = ctx.request.headers?.token || ctx.request.headers?.authorization || ctx.request.body?.token;
    if (token) {
      // 挂载,方便后续取值
      ctx.request.body.token = token;
      let user = {};
      try {
        user = jwt.verify(token, salt);
        ctx.request.body.user = user;
      } catch (e) {
        // 可能是token过期
        console.log("可能是token过期");
        ctx.body = TokenExpiredError;
      }
    } else {
      result.push("token不存在");
      return result;
    }
  }
  return result.length === 0 ? true : result;
};

上面这里是目前改进的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名之辈无名之辈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值