龙空技术网

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

欧文看数据 94

前言:

当前我们对“angular 16 browseresbuild报错”都比较注意,咱们都需要剖析一些“angular 16 browseresbuild报错”的相关内容。那么小编也在网上汇集了一些关于“angular 16 browseresbuild报错””的相关知识,希望各位老铁们能喜欢,同学们一起来了解一下吧!

明知山有坑, 偏向坑堆行. 经过前面两波文章的踩坑, 目前对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文件:

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

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

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

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

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

好, 接下来就要做数据库模型了.

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

User table

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

User 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很类似)

User.controller.js

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

route.config.js

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

index.js

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

user.http

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

get all users请求, 成功

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

date conversion error

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

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

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

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

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

成功发送请求

DB中验证 成功

结束语:

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

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

标签: #angular 16 browseresbuild报错