当前位置: 首页 > news >正文

使用 typescript + express 创建 NodeJs 后端服务

使用 typescript + express 创建 NodeJs 后端服务

初始化 NodeJs 程序

npm init -y

安装依赖

pnpm add express
pnpm add ts-node nodemon @types/node @types/express -D

配置 nodemon

在根目录创建nodemon.json来配置 nodemon:

{"watch": ["./"],"ext": ".ts,","exec": "ts-node app.ts"
}

配置启动脚本

package.json 中配置启动脚本:

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

由此,一个 typescript 版本的 NodeJs 工程就搭建好了。然后就开始安装 express 等依赖,来写业务代码了。

错误处理

根据官方文档的描述,express 是自带错误处理的逻辑的。当然如果 express 的错误处理逻辑不满足我们的业务规范,我们可以通过自定义 errorHandler 来统一处理错误,比如:

export const errorHandler: ErrorRequestHandler = function (err,req,res,next
) {try {res.status(500).send({ err: err.stack });} catch (error) {res.status(500).send(err);}
};app.use(errorHandler);

**注意:**这里需要注意,我们自定义的错误处理 handler 需要放在其他的中间件和路由后面(You define error-handling middleware last, after other app.use() and routes calls;)

404 处理

编写 404 处理 handler 并且在其他的路由后面 use:

export const notFoundHandler: Router = Router().use((req, res) => {res.status(404).sendFile(resolve(__dirname, "../../public/404.html"));
});app.use(mainHandler);
app.use(authHandler);
app.use("/api/auth", authRouter);
app.use("/api/user", userRouter);
app.use("/api", indexRouter);
// *
// *
// *
// *
app.use("*", notFoundHandler);
app.use(errorHandler);

问题记录

使用 express-async-errors 处理异步错误

描述:如果我们用 async 和 await 去拦截代码错误,需要使用 try catch 去拦截错误,每个接口都这样去做太麻烦了,因此使用 express 本身的错误处理加上第三方库 express-async-errors 来处理:
使用文档:官方文档, CSDN

// app.ts
require("express-async-errors");

相关文章:

  • Angular 依赖注入介绍及使用(五)
  • 使用 webpack 打包 express 应用
  • Flutter笔记:getX库中的GetView中间件
  • 【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析B
  • iOS应用加固方案解析:ipa加固安全技术全面评测
  • 《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS
  • PPT转PDF转换器:便捷的批量PPT转PDF转换软件
  • 安全区域边界(设备和技术注解)
  • 【C#学习】var和object变量对比
  • 后端接口错误总结
  • 探索人工智能领域——每日30个名词详解【day3】
  • 力扣刷题篇之数与位2
  • 把大模型装进手机,总共分几步?
  • Java排序算法之归并排序
  • 【考研复习】二叉树的特殊存储|三叉链表存储二叉树、一维数组存储二叉树、线索二叉树
  • @angular/forms 源码解析之双向绑定
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • __proto__ 和 prototype的关系
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android优雅地处理按钮重复点击
  • Bootstrap JS插件Alert源码分析
  • C++类的相互关联
  • CEF与代理
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTML5新特性总结
  • Javascript编码规范
  • JS 面试题总结
  • MobX
  • node-glob通配符
  • Protobuf3语言指南
  • vue-loader 源码解析系列之 selector
  • 基于遗传算法的优化问题求解
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #{}和${}的区别?
  • #QT项目实战(天气预报)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (23)Linux的软硬连接
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (LeetCode) T14. Longest Common Prefix
  • (二)fiber的基本认识
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (接口自动化)Python3操作MySQL数据库
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)http-server应用
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转载)从 Java 代码到 Java 堆
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net CHARTING图表控件下载地址
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?