内容简介:很多时候,我们在学习了某个新东西以后,却不知道如何在项目中运用自己学到的新东西。本篇旨在使用 Node.js + TypeScript 实现一个简单的登陆注册后台服务器,以此更加深入的理解 ts 在实际开发中的运用。阅读本篇专栏前,你需要掌握以下知识:现在我们需要实现一个登陆注册的服务器,进行分析,列举出以下需求:
很多时候,我们在学习了某个新东西以后,却不知道如何在项目中运用自己学到的新东西。本篇旨在使用 Node.js + TypeScript 实现一个简单的登陆注册后台服务器,以此更加深入的理解 ts 在实际开发中的运用。
基础知识
阅读本篇专栏前,你需要掌握以下知识:
- 掌握 JavaScript 基础;
- 了解 Node.js 及 Express 框架;
- 了解 TypeScript 基本知识,可参考 TypeScript 要点知识整理 。
从需求出发
现在我们需要实现一个登陆注册的服务器,进行分析,列举出以下需求:
- 注册功能
- 用户可通过输入用户名和密码进行注册;
- 用户名要求唯一;
- 注册成功后,默认自动登陆系统,返回对应用户标识(即 Token)给前端。
- 登陆功能
- 用户通过输入用户名和密码进行登陆;
- 后台进行用户名和密码的校验,校验不通过返回“用户或密码错误”的提示;
- 登陆成功后,返回用户对应的标识。
项目初始化
- 创建项目文件夹 simple-login-node,进入文件夹;
- 进入项目文件夹,通过 npm init , tsc init 以及 tslint --init 初始化项目,初始化前,请确保已全局安装过 npm、typescript 以及 tslint,可通过以下命令进行安装;
npm install -g npm npm install -g typescript npm install -g tslint 复制代码
- 在根目录下创建 /src 目录,在目录下建立 app.ts 文件。
进行以上操作后,我们的目录结构如下:
具体文件说明
/src/app.ts // 程序入口文件 .npmrc // 项目 npm 配置文件,可针对项目单独设置 npm 的配置 package.json // 项目模块描述文件 tsconfig.json // typescript 配置文件 tslint.json // tslint 配置文件 复制代码
以上就是一个使用 typescript 编写的 node.js 项目的基本结构,我们来进一步细分,每个配置有哪些重要的配置呢?
package.json
-
scripts
配置指令集合,当我们使用 npm run * 的时候,* 表示我们在 script 节点下配置的指令。
"scripts": { "test": "echo \"Error: no test specified\" && exit 1" } 复制代码
以上配置,当我们执行 npm run test的时候,实践会将 test 后配置的语句进行执行,即 echo "Error: no test specified" && exit 1
- dependencies
在项目下使用 npm install --save * 安装的包,及其版本 - devDependencies
在项目下使用 npm install --save-dev * 安装的包,仅在开发模式下安装。因为 typescript 仅在编译时检查代码,即仅在开发时有效,因此很多 typecript 相关模块以及带声明文件的第三方模块仅在开发模式下安装。
下面我们安装 express 模块,在项目根目录下运行:
npm install --save express // 安装普通 express 模块,并在 dependencies 下生成包记录 npm install --save-dev express // 安装带有声明文件的 express 模块,并在 devDependencies 下生成包记录,仅开发模式下安装。 复制代码
此时 package.json 如下(仅贴关键代码):
"dependencies": { "express": "^4.17.1" }, "devDependencies": { "@types/express": "^4.17.0" } 复制代码
tsconfig.json
如果一个目录下存在存在 tsconfig.json 文件,那么就意味着这个目录是 typescipt 项目的根目录。tsconfig.json 定义了用来编译这个项目的根目录及编译选项。让我们一起来看看其中的一些关键配置项。
"target": "es6" // 指定 EECMAScript 的目标版本, 这里我们采用 es6 "module": "commonjs" // 指定编译生成哪个模块的系统代码,考虑到兼容性,这里我们设置成 commonjs "moduleResolution": "node" // 决定如何处理模块。设置为 node "outDir": "dist" // 编译输出目录,即 .ts 文件编译成 .js 文件后的输出目录。这里设置为根目录下的 /dist 目录 "baseUrl": "./" // 定义 ts 项目的根目录,设置 paths 前必须设置 baseUrl,paths中设置的路径是基于根目录来的 "paths": {"*": ["node_modules/*", "src/types/*"], "@/*": ["src/*"]} // 定义路径别名,即当我们通过路径引入一个模块时,可以使用别名来进行引入,这里第一个 * 设置是为了引入第三方模块; 第二个 '@/*' 则是为了直接快捷的导入 /src 下的模块。 "include": ["src/**/*"] // 需要编译的 ts 文件,这里设置为 src 目录下的所有文件 复制代码
tslint.json
tslint 配置文件,用于检查代码是否符合设置的代码规范,不符合将会提示对应错误,具体设置请看文章最后的源码。
搭建 express 服务
- 安装 body-parser 模块,用于处理 post 请求的请求体
npm install --save body-parser 复制代码
- 在 /src 目录下建立 config 目录下,目录下建立 index.ts,用于存放项目的一些开修改配置,我们将 Express 服务占用的端口写在其中,代码如下:
const systemConfig = { port: 8000, }; export default { systemConfig, }; 复制代码
- 我们这可是 typescript 项目,我们试着定义一下 配置中 systemConfig 变量的类型,在 /src 目录下建立 types 目录,用于存放项目的所有类型定义,在 /types 下建立 config.ts 文件,对类型进行定义,并在配置文件中引入
// /src/types/config.ts export interface ISystemConfig { port: number; } // /src/config/index.ts import { ISystemConfig } from "@/types/config"; const systemConfig: ISystemConfig = { port: 8000, }; 复制代码
这样就限定了 systemConfig 对象下只有一个属性 port,且类型为 number,并且这样我们在使用 systemConfig 时,将会有代码提示其内部属性哦。 4. 在 /src/app.ts 下创建 Express 服务
// 第三方模块 import bodyParser from 'body-parser'; import express from 'express'; import { NextFunction, Request, Response } from 'express'; // express 申明文件定义的类型 // 自定义模块 import { systemConfig } from '@/config'; const app = express(); // 处理 post 请求的请求体,限制大小最多为 20 兆 app.use(bodyParser.urlencoded({ limit: '20mb', extended: true })); app.use(bodyParser.json({ limit: '20mb' })); // error handler app.use(function(err: Error, req: Request, res: Response, next: NextFunction) { return res.sendStatus(500); }); app.listen(systemConfig.port, function() { console.log(`the server is start at port ${systemConfig.port}`); }); export default app; 复制代码
项目运行
大功告成,我们来运行试试
node ./src/app.ts 复制代码
但是。。语法错误
这时候我们想起来, ts 文件是无法直接运行,我们来先编译一下自己的 ts 代码,在根目录运行
tsc 复制代码
还记得我们之前在 tsconfig.json 中设置了 编译后的 js 代码的输出目录为 /dist 目录,我们执行命令后,可以看到 /dist 目录在根目录下生成了!
来看看 dist 目录下结构
可以看到,所有代码都生成了对应的 js 代码,且目录结构与 ts 代码目录结构一致。 我们运行 app.js 看看
耶!成功了!我们浏览器访问看看
因为没有定义具体的接口,所以返回了 “Cannot Get /”,但是我们服务器已经启动了!
一个问题
难道我们更新了代码都要重新编译,然后在启动服务吗?
解决办法
安装 nodemon 以及 ts-node 用于监控 指定目录 ts 代码的改动,改动后自动编译运行项目。
// 仅开发环境安装 npm install --save-dev nodemon npm install --save-dev ts-node 复制代码
安装完成后,我们使用 nodemon 监控 /src 下所有 ts 文件的改动,当改动发生后,使用 ts-node 重新启动项目。命令如下:
nodemon --watch 'src/' -e ts --exec 'ts-node' ./src/app.ts 复制代码
可以看到,当我们改动 config 中端口号为 8001 后,项目真的有自动重启,棒棒哒!
优化一下
可以看到,上面那条启动命令有点儿长,每次都输入这么一长串是不是不太友好!那么有没有简化的方式呢?有!还记得前面我们说过, package.json 中可以配置启动脚本!
// 在 script 标签中加入 dev 配置 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "nodemon --watch 'src/' -e ts --exec 'ts-node' ./src/app.ts" } 复制代码
然后我们只要运行 npm run dev 就可以启动项目了,看看效果
耶!给自己一个赞0.0
总结及源码
本篇初步搭建了一个基于 typecript 的 express 服务,下篇文章将会继续讲解 mongodb 的连接。如果有不足的地方欢迎指正。如果你觉得对你有帮助的话,不要忘了点赞和关注哦^o^
本节源码地址: github.com/liyuezu/sim…
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Hacking Growth
Sean Ellis、Morgan Brown / Crown Business / 2017-4-25 / USD 29.00
The definitive playbook by the pioneers of Growth Hacking, one of the hottest business methodologies in Silicon Valley and beyond. It seems hard to believe today, but there was a time when Airbnb w......一起来看看 《Hacking Growth》 这本书的介绍吧!