最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Next.js + typerom 实践 - 博客系统(中)

    正文概述 掘金(李彦辉Jacky)   2021-01-14   477

    最近用 Next.js 和 typeorm 完成了前端小白的第一个全栈项目,本文会记录我在做项目的过程中学习到的一些知识点,和遇到的那些奇奇怪怪的 Bug

    Github - 献上源码地址

    博客系统 - 献上预览地址,喜欢的话就留下一篇博客吧

    上篇文章 - 记录了初始化项目的过程,这么文章初始化数据库


    初始化数据库

    什么是 ORM

    ORM 是 Object–relational mapping 的简称,这个技术的作用是通过实例对象的语法,完成关系型数据库的操作的技术 从这个例子可以看出,ORM 的写法,明显更方便简洁

    SELECT id, first_name, last_name, phone, birth_date, sex
     FROM persons 
     WHERE id = 10
    ------ 改成 ORM 的写法
    p = Person.get(10);
    name = p.first_name;
    

    TypeORM

    Typeorm 是一个可以使用 JavaScript 和 Typescript 来操作数据库的库,目前是 0.2.30 版本,还没发布 v1.0.0 我本打算用 Sequelize.js,但是发现它对 TS 支持不好,于是选用了这个库,它有以下特点

    • 默认支持 TypeSciprt
    • 支持关联 Associations
    • 支持事物 Transaction
    • 支持数据库迁移 Migration

    简单的介绍旧就说到着,开始敲代码吧

    创建数据库

    创建数据库目录

    1. 在项目目录里创建 blog-data 目录
    2. .gitignore 里添加 /blog-data/

    启动 PostgreSQL

    一句命令启动 pg

    docker run -v "$PWD/blog-data":/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=blog -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.2
    

    如果报错,可以看这篇教程,或者直接google 搜索吧

    如果下载速度慢 先搜阿里云 Docker 镜像 (要登录阿里云),再搜 Docker 加速

    启动完成后

    docker ps -a // 这句话查看容器状态
    docker logs 容器id 这句话查看启动日志
    

    SQL 创建

    一个成熟的 orm 框架一般会提供创建数据的 API,但是 Typeorm 并没有,那就只能手动了 ?

    进入 docker 容器

    docker exec -it 容器id bash 
    // 容器id 可以通过 docker ps -a 查询
    

    进入 pg

    psql -U blog -W
    

    由于启动 pg 的时候,设置成无需密码了,所以直接回车就能进入 如果需要加密码,可在 docker run 选项里面的 -e POSTGRES_HOST_AUTH_METHOD=trust 替换成 -e POSTGRES_PASSWORD=123456

    创建数据库

    按照正式的开发流程,我们需要创建三个数据库: 开发、测试、生产

    分别是 blog_developmentblog_testblog_production

    CREATE DATABASE blog_development ENCODING 'UTF8' LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8';
    

    一些常用的 pg 命令

    \l 用于 list databases,展示数据库
    \c 用于连接数据库
    \dt 用于展示数据库中的table
    

    此时使用 \l 命令,看到这样就是成功啦~ Next.js + typerom 实践 - 博客系统(中)

    安装 TypeORM

    安装依赖

    yarn add typeorm reflect-metadata @types/node pg
    

    修改 tsconfig

    "compilerOptions": {
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
    }
    

    运行 npx typeorm init --database postgres 初始化 Typeorm

    这个命令会帮我们创建一些文件包括:

    src
    │   ├── entity        // 实体
    │   │   └── User.ts
    │   ├── index.ts
    │   └── migration     // 迁移
    

    其中 index.tsUser.ts 都是官方的例子,我们可以先删掉,后面根据自己需求再创建

    最后在 ormconfig.json 中配置我们的数据库信息:

    "username": "blog",
    "password": "",
    "database": "blog_development"
    

    禁用 sync -- 重要配置

    在 ormconfig.json 文件中将 "synchronize": "ture" 改为 "false"

    如果是 true,那么在连接数据库时,typeorm 会自动根据 entity 目录来修改数据表

    假设 entity 里面有 User,就会自动创建 User 表

    看起来很方便呀,为什么要禁用呢

    因为 sync 功能可能会在我们修改 User 时直接删数据 Next.js + typerom 实践 - 博客系统(中)

    这种行为绝对不能发生在生产环境,所以我们要一开始就杜绝 sync 功能

    如何运行 TypeScript

    矛盾

    Next.js 默认使用 babel 来将 TS 编译为 JS (内置功能)

    TypeORM 推荐使用 ts-node 来编译 (没有内置)

    babel 和 ts-node 对 TS 的支持并非完全一致

    所以我们统一使用 babel 来编译 TS

    安装 babel

    先将 Node.js 升级到 v14,然后安装 @babel/cli yarn @babel/cli

    然后使用 babel 将 src 中的 TS 文件编译为 JS

    npx babel ./src --out-dir dist --extensions ".ts,.tsx"
    

    敲击回车,啪,很快哟

    但是没成功,还报了一堆错

    Next.js + typerom 实践 - 博客系统(中)

    经验告诉我,遇到错误不要慌

    抓住错误使劲搜

    Support for the experimental syntax 'decorators-legacy' isn't currently enabled

    经过几个小时的搜索终于有结果了 ?

    Next.js + typerom 实践 - 博客系统(中)

    I had the same problem

    那就跟着操作做吧

    安装插件

    yarn add --dev @babel/plugin-proposal-decorators
    

    接着是修改 .babelrc 文件,我们没有,那就创建一个

    现在在 next.js 的官网中,查到默认配置,然后加上答案的配置

    {
     "presets": ["next/babel"],
     "plugins": [
      ["@babel/plugin-proposal-decorators", { "legacy": true }]
     ]
    }
    

    重新运行刚刚失败的命令 Next.js + typerom 实践 - 博客系统(中)

    成功啦~

    那么问题来了,编译后的 JS 代码在哪里呢?

    --out-dir dist --extensions ".ts,.tsx" 看看运行的命令 --out-dir dist 那当然是 dist 文件了

    此时直接运行 node dist/index.js 还是出现报错了

    修改 ormconfig.json

    因为ormconfig.json 还是默认配置,我们运行 node dist/index.js 还是会运行 src 下的 entity、migrations、subscribers 文件

    修改 ormconfig

    "entities": [
      "dist/entity/**/*.js"
    ],
    "migrations": [
      "dist/migration/**/*.js"
    ],
    "subscribers": [
      "dist/subscriber/**/*.js"
    ]
    

    再次运行 node dist/index.js 成功啦!

    工作流总结

    步骤

    • 统一让 Next.js 和 TypeORM 使用 babel 翻译 TS
    • 每次修改 src 的 TS 代码后,翻译为 dist 里面的 JS
    • 使用 node 运行 dist 里面的 JS,执行 TypeORM 任务

    Next.js + typerom 实践 - 博客系统(中)


    这篇文章记录了数据库的初始化过程,那么下篇文章一起来使用 TypoORM 操作数据库吧


    起源地下载网 » Next.js + typerom 实践 - 博客系统(中)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元