0%

9-27个人总结

  • res.json()是返回给客户端一个 json 对象,但是并不会就此停下里,需要在前面加上 return, 才会停止整个 API 或者方法.

  • Array 对象有 unshift()和 push()方法,组合成队列,头出尾进

    • 还有 push() 和 pop() 方法组合成栈,尾进尾出,
    • 也可以用 unshift()和 pop() 方法组合成头进尾出.是另一种队列,同理还可以有头进头出,shift() 和 unshift()
  • Promise 的使用: 把异步操作全部封装成 Promise, 然后使用 then() 传递参数,这样可以保证操作的先后顺序,而不会因为异步而顺序错乱.

  • 被 reject 的参数也会传递给下一个 then 里,所以所有的错误都要被 reject 这样最后才会被 catch

  • 异步尤其要注意循环!循环往往会打乱异步操作的顺序.使用 async 库可以一定程序上去避免这个问题.async.each(arr,(item, callback)=>{},(err) =>{})会在循环中去异步执行,但是整个过程完成后会执行 err=>()的这个方法参数,简单的说就是第一个参数是数组,第二个参数是数组的项和 callback, 第三个参数是循环执行完后执行的操作.

  • 但是 async 还是有问题,他的整个过程是异步的,如果要求返回是数组是按原数组的顺序返回, async.each() 是做不到的,也许使用 Promise.all 可以,以后可以试验一下.

  • 在写代码之前先打一下草稿,把请求的数据格式和返回的数据格式和前端定下来,以免以后修改.

  • 还可以思考一下哪些操作会使用的比较频繁,比如提取用户某些信息,根据 userId 获取用户信息,根据手机号获取用户信息,通过 roomId 获取用户信息这种,尤其是代码量大的操作,像给数组返回数组,这种最好是封装成一个 Promise 的方法,以后写接口时会大量的复用

  • 甚至可以和前端定好返回是状态码–> status:200||500||1001,这样的哪个代码代表什么意思,这样就不用特意用 msg 去说明情况,msg 是用来提示用户或者描述具体问题的

  • 活用 lodash,_.get(obj,’path’, default), .isEmpty(),.isUndefined()等等,有些方法没有结果会返回 undefined 有些则是空对象或者空数组,这些都可以减少代码的复杂性,而提高代码的可阅读性,尤其是保证代码的安全性,不会因为 undefined.get()中 can’t read the propotype of undefined 而报错,也不用单独写算法去检测对象是不是空或者 undefined 或者是不是 Array

  • 把文件封装成 module,在文件的最后一定要加module.exports = router;这样在其他文件里才可以获取的到,如果要 exports 的不止一个对象,需要写成对象module.exports = {router:router, func : someFunction};这样写的话在引入时也要写明const heroMsg = require('./hok').heroMap;

  • 中间件是指在路由中过程中去执行的方法,router.get('/audio/userRoom',jwt.verify,(req, res) => {}),如果报错这个 API 就不会继续执行下去,如果没错才会继续,不需要写参数(),req 会自动被获取

  • 要理解 app.use() 到底做了什么事,两个参数分别代表什么意思.

  • 灵巧的使用 Map 数据结构, Map 是一个完完全全的键值对, object 是字符串对应值,通过.str 来调用,而 Map 更像是数组一样,通过[key]来引用,这样来获取一些非常规的键值对组合是非常有用的.

  • Set 类型也可以学着使用,一种新型的数组,不过这个数组可以用

    • add(value):添加某个值,返回Set结构本身。
    • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
    • has(value):返回一个布尔值,表示该值是否为Set的成员。
    • clear():清除所有成员,没有返回值。
    • 最重要的一点, Set 类型成员不能有重复,所以可以用来最简单代码去重
  • 比起第三方数据存储,用自己本地的数据存储显然要快更多.减少网络通讯时间,所以以后写后端,数据部分最好用自己服务器本地的 MySQL 或者 MongoDB, 这样怎么读写都是在本地,而不用担心查数据库的次数多了,会带来的网络通讯延迟导致的 API 性能异常差的问题,毕竟本地数据库读写比网络数据库读写快不是一点点,所以读写量大的数据必须放在服务器本地.

  • 方法分类要做好,比如按功能模块分,比如按数据库操作分,又比如按数据库文件对象分.我觉得可以把对数据格式化,提取时间,获取随机数,数字精度处理这样所有文件的都有可能用到的方法写在一个文件里,然后把数据库操作封装到一个文件里,类似种种

  • 如果有时间的话,可以用测试先行模式,先把单元测试写好,这样每次修改代码只要跑一次单元测试就知道这次的代码修改有没有引起其他API 或者方法的错误.减少提交错误代码到 github 再提交到服务器的这种失误,这样非常浪费时间

  • pm2真的是个好东西, pm2 start xxx 用 pm2起一个后台服务,这样即可用监控进程的内存 CPU 使用情况,又可以持久化的在后台运行,要重启服务也非常方便 pm2 restart xxx

  • redis 是一种非常快的键值对临时数据库,也有 GUI 可以查看数据,不过要收费,如果需要快速的缓存数据,可以用 redis, 不过 redis 不知道怎么存储多个对象的数据目前只会 redis.set(‘key’,’value’)和 redis.get(‘key’, ‘value’),如果要像数据库那也分表,那要怎么做?

  • lsof -i tcp:port //把port换成端口号
    找到PID以后 kill PID //(进程的PID,如2044)

  • 远程 SSH 登录服务器ssh [email protected] -p 4999然后回车输入密码

  • 其实部署最好是写成一个. sh 脚本,这样下次重启电脑以后也可以一键部署,或者在修改了本地代码以后一键更新部署,不过暂时不会写

  • 遇到什么不过马上用 thing3记录下来,不要打断当前的 codeing, 等代码写完以后再去处理bug 或者问题

  • 用 htop 指令监控 Linux 的资源使用情况

  • 用 find / -name 查找 Linux 中某文件的位置