闲聊
刚到公司写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里面的方法返回给其它后端接口:controller中直接返回给前端promise对象:export const testFind = async id => { try { const result = await Model.find({id}); return { error: 0, // api商量好参数表示的意思 result, }; } catch (e) { return { error: 1, message: e, }; } }export const testFind = async (request, reply) => { const result = await Model.find({id: request.id}); return reply(result) } - 前端redux-promise-middleware
这个库简直不要太方便了。它会自己将promise分为三种状态,不同状态处理不同的前端,真的节约了很大工作量。这里后端不论是参数错误还是数据库抑或资源未启动又或路径不对,只要错误都能捕获,真的很方便。至少能很大程度上减少系统崩了的可能性.....
actions.jsreducer.jsimport axios from 'axios'; export const testFInd = (id) => ({ type: TEST_FIND, payload: axios.post('/api/tests/list', {id}), });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。