日记4(node.js错误捕获&&redux-promise-middleware)

155 阅读3分钟

闲聊

刚到公司写node.js时,一个不小心程序就崩了,各种错误简直防不胜防。一直知道js单线程,也一直知道大概那么个理儿,可是写起代码来还是很疼~~前两天部门的一个分享koa2实战,就提到了koa错误捕获处理这个事情,然后下来自己结合已经踩的坑和一些疑惑总结了一下!

教训

  • 资源(如路径)错误 (细心一点,一般应该不会存在确定路径后再更改导致错误)
  • 请求参数错误 (用户输入的数据都是不可靠的!)
    1.前端(antd的from,自定义)会对参数做一的校验。
    2.后端接口处会借助Joi做校验,下面就是自己写过的一段代码,只是换了一下命名:
      import Joi from 'joi';
      <!--传入的参数必须是数组对象,且每个对象必须包含type,test1,test2属性-->
      export const addSchema = {
        payload: {
          schema: Joi.array().items({
            type: Joi.string().required(),
            test1: Joi.number().required(),
            test2: Joi.string().required(),
          }),
        },
      };
  • 数据库错误
    当前端数据到达后台与数据库进行交互时,这个发生错误的概率即大又不大!大是因为概率真的大,小是因为概率也真的小(废话!!!).数据库错误其实自己遇到的就有自身原因(死循坏操作数据库,当然我没干过)导致数据库挂了,还有就是客观原因(刚请求莫名其妙网刚好断了~~)
  • 资源未完全启动
    这个坑自己以前踩过,重启项目后资源(各种包库)未完全启动,自己就刷新系统和,然后崩了......毕竟react项目真的还是比较庞大的.....
  • 自身代码bug (血泪史:如不判断直接循环,取值...)
  • 框架bug (忽略不计)

记性

  • 多学一点,少写一点问题代码
  • try / catch
    try catch 对一般promise异步无效
    try {
    console.log(1);
    setTimeout(function(){
      console.log(2);
      throw new Error("This is a test error 2");
     }, 1000);
    console.log(3);
    } catch(err) {
    }
    console.log(4); // 1 3 4 2
  • await/async
    顺便看下promise,co,callback...
    utils里面的方法返回给其它后端接口:
      export const testFind = async id => {
        try {
          const result = await Model.find({id});
            return {
              error: 0, // api商量好参数表示的意思
              result,
            };
          } catch (e) {
            return {
              error: 1,
              message: e,
            };
         }
      }
    controller中直接返回给前端promise对象:
       export const testFind = async (request, reply) => {
        const result = await Model.find({id: request.id});
        return reply(result)
       }
  • 前端redux-promise-middleware
    这个库简直不要太方便了。它会自己将promise分为三种状态,不同状态处理不同的前端,真的节约了很大工作量。这里后端不论是参数错误还是数据库抑或资源未启动又或路径不对,只要错误都能捕获,真的很方便。至少能很大程度上减少系统崩了的可能性.....
    actions.js
    import axios from 'axios';
    export const testFInd = (id) => ({
      type: TEST_FIND,
      payload: axios.post('/api/tests/list', {id}),
    });
    reducer.js
    import { fromJS } from 'immutable';
    import { PENDING, FULFILLED, REJECTED } from 'redux-promise-middleware';
    import { message } from 'antd';
    const INITIAL_STATE = fromJS({
      list: {},
      loading: false,
    })
    export default (state = INITIAL_STATE, action) => {
    switch (action.type) {
      case `${TEST_FIND}_${PENDING}`:
        return state.set('loading', true);
      case `${TEST_FIND}_${FULFILLED}`:
        return state
          .set('loading', false)
          .update('list', () => fromJS(action.payload.data));
      case `${TEST_FIND}_${REJECTED}`:
        message.error('oops, error');
        return state.set('loading', false);
      default:
        return state;
      }
    };

nrm

经常需要切换仓库地址,于是刚才安装了nrm


工作小插曲:

本来今天的打算工作任务做完后补一下项目中的前端单元测试(写过,不过当没写),但是由于一点自己的bug,花时间去看了一下总监以前写的一个日志组件,就没有多余的时间补了!那个js组件的各种语法用得很炫酷。人与人之间的差距还是很大啊~~~

明日任务

  • 上面提到了js单线程,由于自己以前写PHP的,明天花点时间对比一下js和PHP。