使用typescript搭建express

news2024/9/29 15:26:02

使用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.coloradmin.cn/o/1283718.html

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

相关文章

C语言--每日选择题--Day35

第一题 1. 有如下定义:(x y) % 2 (int) a / (int) b 的值是() int x 3; int y 2;float a 2.5; float b 3.5; A:0 B:2 C:1.5 D:1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

具有五层协议的网络体系结构

目录 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 2、数据链路层 3、网络层 4、传输层 5、应用层 三、数据在各层之间传输的过程 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 利用传输介质为通信的网络结点之间建立、管理和释放物理连…

SQL Sever 基础知识 - 数据筛选(3)

SQL Sever 基础知识 - 四、数据筛选 第7节 BETWEEN7.1 BETWEEN 运算符概述7.2 BETWEEN 示例7.2.1 BETWEEN 与数字示例7.2.2 BETWEEN 和日期示例 第8节 LIKE8.1 LIKE运算符概述8.2 转义字符8.3 LIKE 示例8.3.1 % (百分号) 通配符示例8.3.2 _(下划线)通配符示例8.3.3 [字符列表] …

SAP GRID-ALV复选框+GRID事件

实现功能: 复选框\设置复选框是否可编辑\实现changed_finished事件. 一、ALV增加复选框: 1.1、在输出内表里增加一个SEL的字段: sel TYPE c, 1.2、在build_fieldcat FORM里设置checkbox属性和edit属性,并输出SEL字段:…

机器学习——logistic回归

在之前实验接触到的机器学习算法都是的目的都是对数据集进行分类,即预测得到的结果是数据样本所属的类别,预测输出结果是离散的集合,比如{‘是’,‘不是’}。这次实验学习的是回归模型,与分类模型不同的是,…

基于springboot+vue的景区民宿预约系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

xxljob入门案例与配置

1 配置执行器 在任务调度中心,点击进入”执行器管理”界面, 如下图: 1、此处的AppName,会在创建任务时被选择,每个任务必然要选择一个执行器。 2、”执行器列表” 中显示在线的执行器列表, 支持编辑删除。 以下是执行器的属性说明: 属性名…

postgresql pg_hba.conf 配置详解

配置文件之pg_hba.conf介绍 该文件用于控制访问安全性,管理客户端对于PostgreSQL服务器的访问权限,内容包括:允许哪些用户连接到哪个数据库,允许哪些IP或者哪个网段的IP连接到本服务器,以及指定连接时使用的身份验证模…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

JDK8新特性——Stream流

文章目录 一、Stream流体验二、Stream流的创建三、Stream流中间方法四、Stream流终究方法 Stream流(也叫Stream API)。它是从JDK8以后才有的一个新特性,是专业用于对集合或者数组进行便捷操作的 一、Stream流体验 需求:有一个Lis…

【动手学深度学习】(十)PyTorch 神经网络基础

文章目录 一、层和块1.自定义块2.顺序块3.在前向传播函数中执行代码 二、参数管理1.参数访问2.参数初始化3.参数绑定 三、自定义层1.不带参数的层2.带参数的层 四、读写文件1.加载和保存张量2.加载和保存模型参数 [相关总结]state_dict() 一、层和块 为了实现复杂神经网络块&am…

FacetWP Hierarchy Select网站内容层次结构选择插件

点击阅读FacetWP Hierarchy Select网站内容层次结构选择插件原文 FacetWP Hierarchy Select网站内容层次结构选择插件可让您基于分层分类法创建引导下拉菜单。 FacetWP Hierarchy Select网站内容层次结构选择插件功能 通过引导式下拉菜单过滤结果,一次一个深度级…

现在的00后,实在是太卷了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条…

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)

Unity 在开发的时候如果数据量比较大&#xff0c;或者一部分数据需要存在云端&#xff0c;那么就需要一些数据库 轻量型到大型的包括&#xff1a; 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …

时间序列预测实战(二十三)进阶版LSTM多元和单元预测(课程设计毕业设计首选)

一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行LSTM模型进行时间序列建模&#xff08;专门为了时间序列领域新人编写的架构&#xff0c;简单且不同于市面上大家用GPT写的代码&#xff09;&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效果检测…

Tecplot绘制涡结构(Q准则)

文章目录 目的步骤1步骤2步骤3步骤4步骤5步骤6结果 目的 Tecplot绘制涡结构(Q准则判别)并用温度进行染色 Q准则计算公式 步骤1 步骤2 步骤3 步骤4 步骤5 步骤6 结果

网络初识:局域网广域网网络通信基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、局域网LAN是什么&#xff1f;二、广域网是什么&#xff1a;三. IP地址四.端口号五.认识协议5.1五元组 总结 前言 一、局域网LAN是什么&#xff1f; 局域网…

k8s安装学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…

Leetcode1038. 从二叉搜索树到更大和树(每日一题)

目录 ⚽题目&#xff1a; &#x1f3d0;题目分析&#xff1a; &#x1f3c0;题目解答&#xff1a; &#x1f94e;代码如下&#xff1a; ⚽题目&#xff1a; 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值…

五、分支和循环

目录 1. if 语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套 if 1.5 悬空 else 问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a; &&&#xff0c;|| &#xff0c;&#xff01; 4.1 逻辑取反运算符 &#xff01; 4.2 与运算符 &&…