编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

渐渐上道:Angular+Sequelize第三波踩坑填坑

wxchong 2024-06-19 22:18:43 开源技术 11 ℃ 0 评论

明知山有坑, 偏向坑堆行. 经过前面两波文章的踩坑, 目前对Node的各路报错已经稍有门路. 今天继续分享使用Sequelize路上遇到的坑.


上一篇文章呢, 我们已经把后台REST HelloWorld API建好了, 并且也配置了VS Code进行调试. 接下来就要加入Sequelize访问数据库的部分. (扑通扑通好紧张)


  1. 先安装sequelize和数据库相关的包:
npm install -save sequelize 
npm install -save sqlite3
npm install -save tedious

sequelize: Sequelize ORM包

sqlite3: 内存数据库 (测试跑跑可以用)

tedious: 微软SQL Server的client, 如果用其他数据库, 可以下载对应client.


  1. 接着可以新建一个config文件夹, 再新建一个db配置的node文件:

这里折腾了很久是因为SQL Server数据库是有Instance Name的, 默认是MSSQLSERVER, 默认实例名可以省略配置, 但如果你安装的是SQL Server Express, (就像我这样, 呵呵) 我找了老半天, 才找到如此诡异的配置方式... 套娃中套娃, 套了这么多层options.... 无语无语.

另外测试连接是否成功, 可以用sequelize.authenticate()方法. 当然我个人很不喜欢这种链式调用(invoke chain)的方式, 大家没发现很难读吗? 虽然我有些jQuery链式调用的功底, 但说实话很不喜欢.

牢骚发完, 在cmd中测试一下:

  1. 好, 接下来就要做数据库模型了.
    sequelize支持从ORM Model同步到数据库表结构, 我觉得这做法大部分是用来跑跑测试, 事先不用建表了. 真实世界还是以先数据库建表, 表和表的关系, 然后再到ORM中建相对应的model. 所以这里就按后者顺序来. 数据库建个User Table:



  1. 回到Node项目中, 建立对应的model.

其中id是自增长数字的主键, 可以注意下如何配置. Model名字可以和Table名字不同, 通过tableName配置, schema名字缺省是dbo, 字段名也可以缺省, 默认和field名相同. 我这份model把能缺省的配置也列出来了. 因为我写了个代码生成器根据数据库表结构来生成ORM模型, 曾经用来生成Java Hibernate屡试不爽, 稍作修改, 也能生成sequelize model.


  1. 数据库连了, 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之间的问题. 希望可以帮到一些朋友, 避免重复踩坑. [来看我]

都看到这么底了, 求个赞呗!!!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表