sequelize 增加数据库字段_渐渐上道:Angular+Sequelize第三波踩坑填坑

本文介绍了在使用Sequelize与SQL Server配合时遇到的数据库配置、模型同步、日期转换错误等问题及其解决方案。作者强调了先建数据库表再同步到ORM模型的实践,并展示了如何通过async/await改写链式调用,同时提供了URL路由配置的示例。
摘要由CSDN通过智能技术生成

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

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

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

sequelize: Sequelize ORM包

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

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

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

db.config.js - 数据库配置和测试连接

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

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

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

573bf749c50b31ae6726c422bbfe7d77.png

用cmd node命令测试数据库连接

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

User table

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

User 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很类似)
3bcd522af39b93570b20b830b635302c.png

User.controller.js

最新版的sequelize已经支持ES6的async和await语法, 实在不喜欢用链式调用, 毫不犹豫改成最新菜式:async/await [得意][得意][得意], 大功告成? wait wait, 还没关联URL呢. 比较推荐的做法是新建个route.config.js, 专门负责URL路由:

d73acf104f59afe1405544648dacf32b.png

route.config.js

最最最后! 在index.js中引入route.config.js, 一切看上去那么完美.

caa4b03206c341f2ae51772ceac1aa6f.png

index.js

(一般来讲, 进展这么完美, 坑离得就不远了) 写一个User.http, 试试看create a user [微笑][微笑]

2a762870c1bb0f67d38e0f67c0dee869.png

user.http

先发一个get all users的请求试试?

ca5c0acb48e788f39966233c18629089.png

get all users请求, 成功

在发一个create a user的请求看看? 结果乌鸦嘴, 果然报错了...

12d7a043cd0a25866e6233d6f64cfe44.png

date conversion error

这个错误的解决我找了很久很久, stackoverflow基本翻遍了... 错误的原因是Date对象在stringify的时候, 变成了一个SQL Server不认识的date format. 或者说sequelize在对Date对象做字符串序列化时没考虑SQL Server.

好的我懂得, 大部分程序员都是拿来主义, 碰到问题关键是怎么解!

解决方法 -- 就是在db.config.js上面加这么一段东东, 重写Sequelize中Date的序列化:

901fc6bbac5f7c7c57684aa69ba595d5.png

感谢不知名大神, 提供重写Date...

加入重写Date的序列化, 然后重启Node, 发送新建用户请求:

32137a142b732e2452e08a9330279577.png

成功发送请求

4602e64bef357349c8097cb446888a03.png

DB中验证 成功

结束语:

第一次用Sequelize ORM, 感觉好心累; 由于篇幅, 其他的坑还没来得及填. 留到下期再讲. 这期碰到的问题, 主要都是因为Sequelize和SQL Server之间的问题. 希望可以帮到一些朋友, 避免重复踩坑. [来看我]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值