明知山有坑, 偏向坑堆行. 经过前面两波文章的踩坑, 目前对Node的各路报错已经稍有门路. 今天继续分享使用Sequelize路上遇到的坑.
上一篇文章呢, 我们已经把后台REST HelloWorld API建好了, 并且也配置了VS Code进行调试. 接下来就要加入Sequelize访问数据库的部分. (扑通扑通好紧张)
- 先安装sequelize和数据库相关的包:
npm install -save sequelize npm install -save sqlite3npm install -save tedious
sequelize: Sequelize ORM包
sqlite3: 内存数据库 (测试跑跑可以用)
tedious: 微软SQL Server的client, 如果用其他数据库, 可以下载对应client.
- 接着可以新建一个config文件夹, 再新建一个db配置的node文件:
这里折腾了很久是因为SQL Server数据库是有Instance Name的, 默认是MSSQLSERVER, 默认实例名可以省略配置, 但如果你安装的是SQL Server Express, (就像我这样, 呵呵) 我找了老半天, 才找到如此诡异的配置方式... 套娃中套娃, 套了这么多层options.... 无语无语.
另外测试连接是否成功, 可以用sequelize.authenticate()方法. 当然我个人很不喜欢这种链式调用(invoke chain)的方式, 大家没发现很难读吗? 虽然我有些jQuery链式调用的功底, 但说实话很不喜欢.
牢骚发完, 在cmd中测试一下:
- 好, 接下来就要做数据库模型了.
sequelize支持从ORM Model同步到数据库表结构, 我觉得这做法大部分是用来跑跑测试, 事先不用建表了. 真实世界还是以先数据库建表, 表和表的关系, 然后再到ORM中建相对应的model. 所以这里就按后者顺序来. 数据库建个User Table:
- 回到Node项目中, 建立对应的model.
其中id是自增长数字的主键, 可以注意下如何配置. Model名字可以和Table名字不同, 通过tableName配置, schema名字缺省是dbo, 字段名也可以缺省, 默认和field名相同. 我这份model把能缺省的配置也列出来了. 因为我写了个代码生成器根据数据库表结构来生成ORM模型, 曾经用来生成Java Hibernate屡试不爽, 稍作修改, 也能生成sequelize model.
- 数据库连了, ORM Model有了, 接下来要建controller层了.
controller层? service层? 其实我觉得是差不多意思. controller层这个名字要翻古董的话是Struts 1.0 提出的MVC中的C代表controller层. 可以这么理解, controller是业务逻辑+URL绑定. 而service层是更泛泛的业务逻辑层, 和URL没关系. 既然是REST API, 那肯定需要配置相应URL, 所以说是controller层. 程序员最悲剧的事就是: 讲的都是架构/高并发/设计模式, 做的都是CRUD ... 为啥这么说呢? 来看看controller长什么样吧. (这里只举例Create和两个Find, Update和Delete很类似)
最新版的sequelize已经支持ES6的async和await语法, 实在不喜欢用链式调用, 毫不犹豫改成最新菜式:async/await [得意][得意][得意], 大功告成? wait wait, 还没关联URL呢. 比较推荐的做法是新建个route.config.js, 专门负责URL路由:
最最最后! 在index.js中引入route.config.js, 一切看上去那么完美.
(一般来讲, 进展这么完美, 坑离得就不远了) 写一个User.http, 试试看create a user [微笑][微笑]
先发一个get all users的请求试试?
在发一个create a user的请求看看? 结果乌鸦嘴, 果然报错了...
这个错误的解决我找了很久很久, stackoverflow基本翻遍了... 错误的原因是Date对象在stringify的时候, 变成了一个SQL Server不认识的date format. 或者说sequelize在对Date对象做字符串序列化时没考虑SQL Server.
好的我懂得, 大部分程序员都是拿来主义, 碰到问题关键是怎么解!
解决方法 -- 就是在db.config.js上面加这么一段东东, 重写Sequelize中Date的序列化:
加入重写Date的序列化, 然后重启Node, 发送新建用户请求:
结束语:
第一次用Sequelize ORM, 感觉好心累; 由于篇幅, 其他的坑还没来得及填. 留到下期再讲. 这期碰到的问题, 主要都是因为Sequelize和SQL Server之间的问题. 希望可以帮到一些朋友, 避免重复踩坑. [来看我]
都看到这么底了, 求个赞呗!!!