使用typescript搭建express

使用typescript搭建express

开始

为这个项目创建一个新的目录,使用下面的命令初始化项目并创建一个包。

 NPM init -y

初始化后,让我们安装必要的包

npm i express dotenv cors helmet body-parser 

在express中配置typescript

npm i -D typescript @types/node @types/express @types/dotenv @types/cors @types/helmet

现在我们要在我们的目录中生成 tsconfig.json 文件。使用下面的命令:

 npx tsc --init

打开 tsconfig.json 文件,注释掉 compilerOptions 中的所有字段,并配置 baseUrl 和 outDir

在这里插入图片描述

接下来,让我们创建一个 .env 文件,定义所有敏感变量的。

创建.env文件

port=5000

创建 index.ts 文件

然后创建一个 src 文件夹,在该文件夹下创建一个 index.ts 文件,此时目录结构如下所示:

在这里插入图片描述
之后我们就在 index.ts 文件中开始编写我们的代码。

import * as dotenv from 'dotenv'
import express from 'express'
import cors from 'cors' 
import helmet from 'helmet'// 变量
dotenv.config()const app = express(); // 使用中间件
app.use(helmet()); 
app.use(cors()); 
app.use(express.json())module.exports = app

现在在 src 目录下创建一个 server.ts 文件。

server.ts

require("dotenv").config();
const app = require(".")const PORT = process.env.PORT || 3000
app.listen(PORT, async () => {console.log(`listning on port ${PORT}`)
})

现在我们必须配置我们的开发脚本,我们正在使用的另一个与开发相关的工具是 nodemon,只要文件有变化,就重新启动我们的应用程序或服务器。

此时我们还得安装一个 ts-node 执行引擎。

npm i -D nodemon ts-node

然后在目录中配置一个 nodemon.json 文件。

nodemon.json

{"watch" : ["src", ".env" ], "ext":"js,ts,json", "ignore": ["src/logs/*", "src/**/*.{spec,test}.ts"], "exec": "ts-node --transpile-only src/index.ts"
}

之后在package.json 文件的 scripts 字段中设置一个运行命令用于启动 nodemon。

 "scripts" : {"dev" : "nodemon"}

现在让我们使用该命令来运行应用程序。

在这里插入图片描述

最后,让我们添加一些脚本,比如构建和启动。

"scripts":{"dev": "nodemon", "start": "npm run build && node dist/server.js""build": "tsc"
}

如果我们想在生产环境中运行,可以把 NODE_ENV=production 放在命令行中设置成变量 。如果我们想使用条件语句来执行不同的环境,则需要安装 cross-env:

npm i -D cross-env 
"scripts":{"dev": "nodemon", "start": "npm run build && cross-env NODE_ENV=production node dist/server.js""build": "tsc"
}

现在我们已经完成了项目的基本配置。

typescript 配置

现在,我们将使用一些额外的工具来改进我们的开发工作流。

typescript有很多的配置,但是我们不能在这一篇文章中涵盖所有的配置,如果我们想学习的话,可以检查官方的配置文档说明。

首先,我们配置了 paths,并用下面的配置更改了 typescript.json 文件。

{"compilerOptions": {"target": "es2020","lib": ["es2020"],"typeRoots": ["node_modules/@types"],"allowSyntheticDefaultImports": true,"experimentalDecorators": true,"emitDecoratorMetadata": true,"forceConsistentCasingInFileNames": true,"moduleResolution": "node","module": "commonjs","pretty": true,"sourceMap": true,"declaration": true,"outDir": "dist","allowJs": true,"noEmit": false,"esModuleInterop": true,"resolveJsonModule": true,"importHelpers": true,"baseUrl": "src","paths": {"@/*": ["*"],"@config/*": ["config/*"],"@controllers/*": ["controllers/*"],"@databases/*": ["databases/*"],"@dtos/*": ["dtos/*"],"@exceptions/*": ["exceptions/*"],"@interfaces/*": ["interfaces/*"],"@middlewares/*": ["middlewares/*"],"@models/*": ["models/*"],"@routers/*": ["routers/*"],"@services/*": ["services/*"],"@utils/*": ["utils/*"]}},"include": ["src//*.ts", "src//*.json", ".env"],"exclude": ["node_modules", "src/http", "src/logs", "src/tests"]
}

正如我们在上面的代码片段中看到的,我们已经添加了许多不存在的路径,我们很快就建立了我们项目的结构。paths 项允许我们定义一系列条目,这些条目重新映射导入到相对于 baseURL 的查找位置。

路径别名:使用者定义的名称来替代较长的路径。

npm i -D tsconfig-paths tslib 

tsconfig-paths 用于加载在 tsconfig.json 或者 jsconfig.json 文件中定义的 paths 模块。支持在运行时加载和通过API加载。
tslib 用作包含所有tsconfig助手功能的tsconfig的运行库。

为了使用它们,我们必须修改 nodemon.json 文件:

{"watch" : ["src", ".env" ], "ext":"js,ts,json", "ignore": ["src/logs/*", "src/**/*.{spec,test}.ts"], "exec": "ts-node -r tsconfig-paths/register --transpile-only src/server.ts"}

tsconfig-paths/register 将读取来自 tsconfig.json 中配置的 paths。

验证环境变量

接下来,我们将添加环境变量验证,因为忘记添加环境或不添加环境变量值的正确类型会导致意外错误,导致我们的应用程序故障。

我们使用 envalid 这个库来验证环境变量。

npm i envalid 

我们在 src 文件夹下创建一个 utils 文件夹,并创建一个 validateEnv.ts 文件

在这里插入图片描述

让我们来写这个配置

import { cleanEnv, port, str } form "envalid";const validateEnv = () =>{cleanEnv(process.env, {NODE_ENV: str(), PORT: port(),})
}export default validateEnv;

写完配置后在 index.ts 文件中引用:

import * as dotenv from 'dotenv'
import express from 'express'
import cors from 'cors' 
import helmet from 'helmet'
import validateEnv from '@utils/validateEnv'dotenv.config()validateEnv();
const app = express(); app.use(helmet()); 
app.use(cors()); 
app.use(express.json())module.exports = app

我们可以将环境变量更改为无效,例如将端口更改为字符串 PORT= XYZ

执行命令 npm run dev

它将显示一个错误,例如:

Invalid enviroment variables:PORT: Invalid port input: : "xyz"

但是当我们运行 build/start 命令时,我们得到了一个不同的错误:

Error: Cannot find module '@/utils/validateEnv'
This is because we are using a path alias with '@/utils'.

这个是在打包后的 dist 目录里我们的 index.js 文件是 import validateEnv from ‘@/utils/validateEnv’.

当然,我们可以在没有别名的情况下 import。然而,当我们的项目变得更大时,一个路径别名就会变得非常有用。

为了确保 node 找到模块,我们可以使用 ts-alias ,它用 typescript 编译后的相对路径替换别名路径。

npm i -D tsc-alias

我们可以通过将 build 命令修改为以下方式来利用这个包:

"build": "tsc && tsc-alias",

现在让我们运行我们 start 命令来测试它。

此时不应该有任何错误,我们应该在控制台中看到以下内容:

Listening on port 3000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress批量上传文章和自动发布文章的方法

专业介绍:WordPress批量上传文章技术解析 在现代数字时代,内容创作是网络存在的驱动力之一。对于博客作者、新闻编辑和内容管理员而言,高效地批量上传文章至WordPress平台是提高工作效率的一个关键方面。WordPress作为最受欢迎的内容管理系统…

【C语言】递归详解

目录 1.前言2. 递归的定义3. 递归的限制条件4. 递归举例4.1 求n的阶乘4.1.1 分析和代码实现4.1.2 画图演示 4.2 顺序打印一个整数的每一位4.2.1 分析和代码实现4.2.2 画图推演 4.3 求第n个斐波那契数 5. 递归与迭代5.1 迭代求第n个斐波那契数 1.前言 这次博客内容是与递归有关&…

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断,而是查询发送标志位实现的。 串口5不像串口2一样(串口2可以位寻址,串口5不行),所以如果采用查询模式,需要判断寄存器的数据,我的写法比较简单…

Django高级之——Ajax、cookie与session

一 什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据&#xf…

apk和小程序渗透测试

apk和小程序渗透测试 文章目录 apk和小程序渗透测试小程序渗透测试apk和小程序的抓包安装证书apk渗透 小程序渗透测试 小程序的默认路径在 C:\Program Files (x86)\Tencent\WeChat\WeChatApp 使用UnpackMiniApp、wxappUnpacker工具完成逆向 先打开UnpackMiniApp.exe工具 选…

C++ 指针详解

目录 一、指针概述 指针的定义 指针的大小 指针的解引用 野指针 指针未初始化 指针越界访问 指针运算 二级指针 指针与数组 二、字符指针 三、指针数组 四、数组指针 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 指针与数组 一维数组 字符数组…

pbootcms建站

pbootcms建站 一、下载pbootcms二、安装1、进入宝塔面在网站栏,新建站点,将该址里面文件全部清再将下载的pbootcms上传至该地址。 三、修改关联数据库1、在根目录下/config打开database.php照如下修改这里我使用mysqli数据库。修改并使用自已创建的数据库…

全网最新最全的自动化测试:python+pytest接口自动化-接口测试基础

接口定义 一般我们所说的接口即API,那什么又是API呢,百度给的定义如下: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口)&#xff0c…

最长连续序列代码中的细节解读

最长连续序列 一、题目概述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 原题地址:https://leetcode.cn/problems/l…

C语言入门基础知识(一)

#C语言基础知识入门 说明C语言代码块结构 #include <stdio.h> //这个语句的功能是进行有关的预处理操作。include称为文件包命令&#xff0c;后面尖括号中内容称为头部文件或收文件。 #include "demo.h" //导入的是工程内部的头文件 int main() { //main 函…

【踩坑】解决maven的编译报错Cannot connect to the Maven process. Try again later

背景 新公司新项目, 同事拷给我maven的setting配置文件, 跑项目编译发现maven报 Cannot connect to the Maven process. Try again later. If the problem persists, check the Maven Importing JDK settings and restart IntelliJ IDEA 虽然好像不影响, 项目最终还是能跑起来…

2023-2024-1-高级语言程序设计-第2次月考编程题

注&#xff1a;此前已发布过的题解不再发布&#xff08;原题请在下面位置进行搜索&#xff09;。 7-1-2 排序(算法任意) 本题要求将给定的n个整数从大到小排序后输出&#xff08;可使用任意排序算法&#xff09;。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给…

笔记66:自注意力和位置编码

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a a a a

paddleocr文本检测改进变迁

数据增强&#xff1a; BDA(Base Data Augmentation)&#xff1a;色调变换&#xff0c;透明度变换&#xff0c;旋转&#xff0c;背景模糊&#xff0c;饱和度变换。 图像变换类&#xff1a;AutoAugment&#xff0c;RandAugment 图像裁剪类&#xff1a;CutOut、RandErasing、Hi…

万字长文带你搞定MMUTLBTWU

最近一直在学习内存管理&#xff0c;也知道MMU是管理内存的映射的逻辑IP&#xff0c;还知道里面有个TLB。 今天刚刚好看到了几篇前辈的文章&#xff0c;很是不错&#xff0c;于是这里来一起学习一下吧。 PART 一&#xff1a;MMU 架构篇 MMU&#xff08;Memory Management Uni…

人工智能-A*算法-八数码问题

一&#xff0c;A*算法设计思想 A*算法&#xff08;A-star&#xff09;是一种寻路算法&#xff0c;主要用于游戏、机器人等领域。 它的设计思想是将最短路径搜索问题转化为一个优化问题&#xff0c;通过计算每个节点的评分&#xff08;f(n) g(n) h(n)&#xff09;来寻找最优…

Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll

环境: Win7 旗舰版 64位 Rustdesk1.19自编译客户端 问题描述: Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll "api-ms-win-shcore-scaling-|1-1-1.dll" 是一个系统动态链接库文件,它是Windows操作系统的一…

Ubuntu20.04/Linux中常用软件的安装

文章目录 一、安裝与卸载微信二、安裝与卸载QQ三、安装Chrome浏览器并加入apt更新四、安裝VScode4.1 安装常用插件4.2 减小Ipch缓存&#xff1a; 五、安装代码对比工具Meld六、安裝WPS七、安装PDF阅读器Foxit Reader八、安装文献管理软件Zotero九、安装有道云笔记十、安装远程控…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

MysqlCluster集群部署

1.引言 1.1目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1. 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群…