收获

  • <el-menu > 这里不加router ,index无法跳转
  • ${}这种字符串很香,不再用++拼接了(好无语明明学过,却忘记用…)
  • 修改页面和新增页面可以用一个组件,一些选择显示的东西用v-if
  • 删除的话,就用delete请求
  • async和await,太好用了,以后就不用写回调了
  • parent: {type: mongoose.SchemaTypes.ObjectId, ref: "Category"}这里的type类型也可以是String,Number等类型,但是没有理由是,也就是说想搞这种聚合类型的,就不要改这个typeref就是绑定的Model。等到查询的时候,可以调用populate('key值')进行查找。
  • 通用的CRUD接口,细微不同可以用:setOptions来区别。
    app.use('/api/rest/:resource', async (req, res, next) => {const modelName = require('inflection').classify(req.params.resource)req.Model = require(`../models/${modelName}`)next()}, router)

inflection模块是名字的单复数转换,一般来说,前端请求路径都是小写复数,Model都是大写单数,所以利用这个模块来转为对应的模块名来引入模块。将引入的模块挂载到req上。这里为了能够使用父级app的动态参数resource,在实例化router时,还要加上express.Router({ mergeParams: true})来合并父级参数。next()是必须的,没有它,app.use执行到挂载req.Model之后,就不再执行。

 const queryOptions = {}if (req.Model.modelName === 'Category') {queryOptions.populate = 'parent'}const items = await req.Model.find().setOptions(queryOptions).limit(10)
  • js中对象点两次的属性,就必须保证第二级的属性存在。也就是说 model.scores.attack,必须保证model.scores存在,即使是空对象。

  • 未定义的属性,不要用是否等于null来判断,要用是否等于undefined来判断。
    没有这种说法,0,"",undefined,nullfalse都会在条件判断中被判为false,且它们的反!都为true

  • 在今天使用vue2-editor时,自定义上传图片,使用到一个事件叫imageAdded,且这里是官网写法。但是发现,怎么弄都不会触发这个事件,后来网上一查,发现这里有一个坑,那就是不要使用驼峰命名法来写事件名。当把事件名改为image-added,就正常了。这就涨了个记性,以后的事件名都不要用驼峰啦!其他名称,例如什么组件名字,暂时还没遇到坑。

  • watch可以监听路由的跳转

  • 把数组的length设置为0,即可清空数组

  • 登录的服务端验证:

    1. 根据用户名在数据库查找,存在下一步,不存在返回错误码
    2. 根据用户名找到的用户信息,使用bcrypt模块解密并对比密码是否正确,正确下一步,不正确返回错误码
    3. 返回一个token,使用jsonwebtoken模块,前端要设置一个请求拦截器,把token提交。
  • 在返回以上这些错误码时,可以使用http-assert模块抛出异常,并配置中间件抓住处理。

  • 写中间件的时候,导出的最好是一个函数返回的另一个函数,也就是说可以配置的。

  • req.app 完全等于app,在中间件无法使用app时,就使用req.app

  • Vue.mixin

  • 为了获取一个可能会发生变化的变量,用一个函数来返回它吧
  • <el-dropdown-item @click> 这么写没有触发点击事件,要写成@click.native
  • 下面这个代码是,一个表关联多个表的时候,可以以这种方式在通用的CRUD接口中查询多个所需的关联字段。

let queryOptions = {}if (req.Model.modelName === 'Hero') {queryOptions = [{path: 'partner.hero', select: ['avatar', 'name']},{path: 'categories', select: ['name']},{path: 'items1', select: ['name', 'icon']},{path: 'items2', select: ['name', 'icon']}]require('../models/Category')require('../models/Item')}const model = await req.Model.findById(req.params.id).populate(queryOptions)res.send(model)

已知bug:

  • is-active 在地址前进或后退时,容易抽风
  • 新建英雄时候,要加载上级分类为英雄的分类,这个需求我觉得是要在后端处理的,即在查询数据库的时候处理。但是我目前的通用CRUD接口无法实现,这里是否需要再写一个接口来满足暂时存疑。目前的解决方法是在前端filter一下。

已经解决的bug:

  • 表单回车提交与点击提交行为不一致。(可以用@submit.native.prevent避免)

感受

1.31

怎么感觉比上一次写node简单多了? 知道是有async的帮助简单很多,但是总觉得没怎么写数据库的脚本耶…
而且使用vue直接传数据不用操作DOM真的太香了,不用写之前的art-template,不用写jQuery脚本操作页面…
真的是写程序越来越方便了,不用反反复复的造轮子,更能专注于业务和逻辑。
这就是新技术之所以会流行起来的原因吗?

2.2

做这个项目真的是收获颇丰哈,不仅能复习node知识,而且能以更加厉害的技术实现。
以前不懂得前后端交互的时候,总想着前端哪个技术/框架,能不能和后端哪个技术/框架混用呢?现在看来完全是没有理解透彻,前后端分离的时代哪用得着考虑这些,后端框架随便选,数据库都不限于一种可用。
我打算把这个项目做完之后,再完善完善,老师没讲到的地方或者我自己感觉有逻辑上/技术上的漏洞,完善完善。做完之后会把这个项目传到csdn上,分享给能用到的同学。

2.3

今天又是学到了好多东西啊,什么加密bcrypt,assert报错,token,还有浏览器的两个存储对象LocalStorage和SessionStorage,对node中的中间件的概念越来越清晰。明天就能写完项目,然后就开始完善。

2.4

完成项目,并且完善了英雄的查看页,也完成了根据req.headers.refer来判断是哪里发来的请求而不是靠资源名。
今天加入了导航守卫,给upload接口也用Vue,ximin配置了接口地址,和请求头。
总之,收获颇丰。
要去上传项目了。

完结…

Nodejs+Vue wzry项目 开发记录相关推荐

  1. 尚硅谷——谷粒商城项目开发记录——2021.11.21

    尚硅谷--谷粒商城项目开发记录--2021.11.21 概念: 1.var和let的区别: 作用域: var 声明的变量往往会越域 let 声明的变量有严格局部作用域 声明次数: var 可以声明多次 ...

  2. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

  3. TMS320F28335项目开发记录9_28335之中断系统

    TMS320F28335项目开发记录9_28335之中断系统 2014年11月08日 12:00:12 阅读数:3104 28335中断系统 1.中断系统 在这里我们要十分清楚DSP的中断系统.C28 ...

  4. Vue的项目开发,你应该知道什么

    Vue进行项目开发,我们需要懂得知识栈,应该由这么一些部分构成:vue.js.vue-router.vuex.axios.vue的单文件组件.element-ui等.这些部分,就是vue项目开发的全家 ...

  5. 【Nodejs博客项目开发】之原生nodejs实现博客系统(一)

    [Nodejs博客项目开发]之原生nodejs实现博客系统(一) >>目录 [Nodejs博客项目开发]之原生nodejs实现博客系统(一) 一.接口设计 二.基本目录结构 三.`www. ...

  6. 【Nodejs博客项目开发】之原生nodejs实现博客系统(五)

    [Nodejs博客项目开发]之原生nodejs实现博客系统(五) 一.session存入redis 首先下载redis模块:npm i redis --save db.js 配置redis const ...

  7. 尚硅谷——谷粒商城项目开发记录——2021.11.19

    尚硅谷--谷粒商城项目开发记录--2021.11.19 出现错误 1.SpringBoot测试类出现Could not autowire. No beans of 'BrandService' typ ...

  8. 尚硅谷——谷粒商城项目开发记录——2021.11.22

    尚硅谷--谷粒商城项目开发记录--2021.11.22 概念: 1.对象优化: 新增的API: ES6 给 Object 拓展了许多新的方法,如: keys(obj): 获取对象的所有 key 形成的 ...

  9. 尚硅谷——谷粒商城项目开发记录——2021.11.20

    尚硅谷--谷粒商城项目开发记录--2021.11.20 概念: 1.SpringCloud Alibaba: 简介: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ...

最新文章

  1. 【CV实践】图像检索从入门到进阶
  2. 王者荣耀服务器响应超时,“团战”打游戏,为什么你的网络信号总是连接超时?...
  3. LOST 迷失 Season 1
  4. C#中实现对Excel特定文本的搜索
  5. HALCON示例程序color_pieces.hdev通过MLP训练器对彩色棋子进行分类识别
  6. 应用服务器——JBoss架构分析
  7. 线扫相机 编码器_面阵和线扫工业相机选型
  8. 2019年财政收支分析_2019年模锻行业经济运行情况分析
  9. mac中一一些常用的命令
  10. git 拉取 未能顺利结束 (退出码 1)_小白的 asyncio :原理、源码 到实现(1)
  11. 自学python编程免费教程-Python十分钟入门 自学python基础教程送你参考
  12. 代码逻辑分析_双十一模块 79.34% 的代码是怎样智能生成的
  13. 一张图看懂BGP邻居关系建立过程和BGP报文简介
  14. 远程登录(Telnet)的配置
  15. 电子元器件商城与数据手册下载网站汇总
  16. centos进入管理员_centOS 如何让当前用户取得管理员权限
  17. 面试官:如何实现扫码登录功能?
  18. IDEA搜索插件时显示search results are not loaded check the internet connection解决办法
  19. 科斯定理(交易费用足够低,谁用的好就归谁)
  20. 使用QT:复刻俄罗斯方块游戏

热门文章

  1. 女友说 Git 玩不明白,怎么办?安排。
  2. 完美配件:它可让GoPro相机续航翻倍
  3. Android性能优化最佳实践,源码+原理+手写框架
  4. 音视频封装格式转换器(支持avi格式转换),基于FFmpeg4.1实现(音视频学习笔记二)
  5. itextpdf创建pdf,开箱即用
  6. 灵魂之力—自控力的强大威力
  7. C++构造函数中冒号作用及explicit关键字
  8. 低代码,没有想象的那么容易,一个过来人的吐槽
  9. Cicso 几款IP电话自爆有命令注入高危漏洞
  10. 基于ESP32CAM的手机app控制的图传小车