【Node.js】如何使用 Express.js 和 TypeScript 构建 CRUD API

如何使用 Express.js 和 TypeScript 构建 CRUD API
作者:Racheal Kuranchie
来源:https://medium.com/@rachealkuranchie/how-to-build-a-crud-api-with-express-js-and-typescript-21c7c66e5296


文章目录

      • 如何使用 Express.js 和 TypeScript 构建 CRUD API
        • 先决条件
        • 项目设置
        • 应用程序的包
        • 文件夹结构
        • 服务器连接
        • 创建模式和模型
        • 创建服务
        • 创建控制器
        • 创建路由
        • 测试
        • 结论

如何使用 Express.js 和 TypeScript 构建 CRUD API

在当今的数字世界中,API 是现代 Web 应用程序的支柱,它允许客户端和服务器端组件之间无缝通信。在构建 API 的最流行框架中,Express.js 以其简单性、灵活性和可扩展性脱颖而出。但是,为什么要满足于一个基本的 Express.js API,当你可以用 TypeScript 的力量来增强它呢?在本教程中,我们将向您展示如何使用 Express.js 和 TypeScript 创建一个完整的 CRUD(创建、读取、更新、删除)API,包括数据验证和数据库集成。所以系好安全带,准备将您的 API 开发技能提升到下一个水平!
Mongoose 将作为我们执行逻辑的对象文档映射器(ODM),MongoDB 将被用作我们的数据库,Joi 用于数据验证。

先决条件
  1. Node.js
    在我们开始之前,请确保您的机器上安装了 Node。

  2. MongoDB
    同样,请确保您有一个 MongoDB 实例,无论是来自 MongoDB Atlas 平台,还是来自本地安装。

    • 访问 MongoDB Atlas 平台,注册并创建一个集群,这将生成一个连接字符串,用于本应用程序。点击这里 指导您完成设置您的 mongo atlas 的过程。
    • 本地安装的 MongoDB 应该给您留下像这样的连接字符串:“mongodb://localhost:27020/”。
项目设置

通过创建一个新文件夹或目录来启动项目,使用这个命令一步步进行。

mkdir api # 创建一个文件夹
cd api   # 切换到文件夹
npm init -y  # 初始化应用程序

这将创建 package.json 文件,它将是你所有包的中心。

// package.json
{"name": "api","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

初始化 package.json 后,接下来是安装本应用程序所需的包。

应用程序的包
  • Express.js (文档)
  • mongoose (文档)
  • mongodb (官网)
  • dotenv (文档)
  • typescript (官网)
  • nodemon (官网)
  • joi (文档)
npm install express dotenv mongoose mongodb joi
npm install nodemon --save-dev

一旦您安装了这些,您将看到 node_modules 和一个 package-lock.json 文件添加到 package.json 文件中。下一步是将 typescript 作为开发依赖项安装,以及为已安装的包安装类型。

npm install typescript ts-node @types/node @types/express --save-dev

您会注意到与 typescript 相关的依赖项被安装为 devDependencies。这是因为,尽管代码是用 Typescript 编写的,但它将被编译为“普通”的 JavaScript。

现在要在您的应用程序中使用 typescript,您需要初始化它。为此,我们将创建 tsconfig.json 文件,我们可以在其中自定义编译器选项。我们可以通过使用此命令来获取此文件。

npx tsc --init

tsconfig.json 文件包含许多编译器选项,其中大部分已被注释掉。尽管如此,它可以被定制以适应您的应用程序的特定需求。配置中使用的某些选项非常重要,包括:

  • target: 允许我们指定编译器将输出的目标 JavaScript 版本。
  • module: 指定在 JavaScript 代码中生成的模块代码。CommonJS 被支持,并且是 Node.js 的标准。
  • strict: 启用严格类型检查选项的选项。
  • esModuleInterop: 允许我们将 ES6 模块编译为 CommonJS 模块。
  • skipLibCheck: 如果设置为 true,则跳过默认库声明文件的类型检查。
  • forceConsistentCasingInFileNames: 当设置为 true 时,启用区分大小写的文件命名。

您将必须启用的一个选项称为 outDir,它指定编译步骤后输出将位于何处。注意,这是必要的,因为 typescript 代码需要被编译为普通 JavaScript。您可以在 tsconfig.json 文件的 /Emit / 部分找到此选项并取消注释它。

默认情况下,此选项的值设置为根目录。将其更改为 dist 文件夹:

文件夹结构

是时候创建您的文件夹结构了。我喜欢通过尽可能减少我的代码来实现关注点的分离。这有助于轻松调试,也使您的代码易于阅读和清洁。

创建一个 src 和 dist 文件夹。dist 文件夹将包含所有已编译的代码。在 src 文件夹中,创建这些文件夹:Controllers、Models、Routes、Services、Server 和 Config。在这些文件夹中,分别创建以下文件:post.controller.ts、posts.ts、post.routes.ts、post.service.ts、app.ts 和 db.config.ts。

在根目录中创建一个 .env 文件,并保留您的 mongo DB atlas 数据库用户名和密码。

安装并初始化应用程序中的 typescript 后,下一步是编辑 package.json 文件。将以下内容添加到脚本中:start、dev 和 build。

// package.json
{"name": "api","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "nodemon ./src/Server/app.ts","dev": "nodemon ./src/Server/app.ts","build": "tsc --project tsconfig.json"},"keywords": [],"author": "","license": "ISC","dependencies": {"dotenv": "^16.0.3","express": "^4.18.2","joi": "^17.9.1","mongodb": "^4.13.0","mongoose": "^6.8.2"},"devDependencies": {"@types/express": "^4.17.15","@types/node": "^18.11.18","nodemon": "^2.0.20","ts-node": "^10.9.1","typescript": "^4.9.4"}
}

接下来的阶段是将您的数据库连接到您的应用程序。在 config 文件夹中的 db.config.ts 中,编写此代码。使用 mongoose,我们可以使用 mongoose.connect() 方法连接到我们的数据库并与之通信。

// db.config.ts
// 导入模块
import dotenv from 'dotenv'
import mongoose from 'mongoose'dotenv.config()// 来自 env 的详细信息
const username = process.env.username
const password = process.env.password
const dbName = 'Post'// 连接字符串到 mongo atlas
const connectionString = `mongodb+srv://${username}:${password}@cluster0.tjh8e.mongodb.net/${dbName}?retryWrites=true&w=majority`const options = {autoIndex: false, // 不构建索引maxPoolSize: 10, // 维护最多 10 个套接字连接serverSelectionTimeoutMS: 5000, // 尝试发送操作 5 秒socketTimeoutMS: 45000, // 45 秒后关闭套接字family: 4 // 使用 IPv4,跳过尝试 IPv6
};// 数据库连接
export const db = mongoose.connect(connectionString, options)
.then(res => {if (res) {console.log(`Database connection successfully to ${dbName}`)}
})
.catch(err => {console.log(err)
})
服务器连接

现在我们已经连接了我们的数据库,下一件事是创建我们的服务器,并查看数据库是否真的已经连接。在 express.js 中创建服务器是直接的。您必须导入 express 并将其初始化,通过将其分配给一个变量,然后您可以访问所有 HTTP 方法来使用。为了在请求中传递 JSON 正文,您必须使用 express 方法,如 express.json()。

// app.ts
import express from 'express'
import { db } from '../Config/db.config'
import { router } from '../Routes/posts.routes'const app = express()// 中间件
app.use(express.json())
app.use(express.urlencoded({ extended: true }))// 路由
app.use('/api/v1/posts', router)db.then(() => {// 数据库连接成功后再启动服务器app.listen(7070, () => console.log('Server is listening on port 7070'))
});
创建模式和模型

进入模型文件夹中的 posts.ts,并使用以下代码创建您的模式和模型。模式是数据库表的表示,它描述了您数据库中的类型,而模型是一个设计,它决定了应该在模式中包含什么。PostschemaValidate 指定了请求体中所需的字段类型,以便保存。它作为请求的另一层验证。

// posts.ts// 导入模块
import { Schema, model } from 'mongoose'
import Joi from 'joi'// 验证模式
export const PostschemaValidate = Joi.object({title: Joi.string().required(),description: Joi.string().required(),author: Joi.string().required(),published: Joi.boolean().required(),
})// 创建接口
interface IPosts {title: string,description: string,author: string,published: boolean,
}// Posts模式
const postSchema = new Schema({title: {type: String,// ... 其他 schema 选项},// ... 其他字段
})// 创建模型
export const Post = model('Post', postSchema)
创建服务

创建模型后,下一步是创建服务类,它将包含我们想要执行的所有操作。在服务类中,我们将创建不同的函数,使用 mongoose 查询如 create, find, findById 等来读取、创建、更新和删除帖子。

// post.service.ts// 导入模块
import { Post } from '../Models/posts'export class postService {// 创建帖子async createPost(data: any) {try {const newPost = await Post.create(data)return newPost} catch (error) {// 处理错误}}// 其他 CRUD 操作的函数...
}// 导出类
export const postServices = new postService()
创建控制器

现在,在控制器中,我们将调用服务中的每个函数并执行它。为了使我们的代码易于阅读和清洁,我们尽量保持每个文件尽可能简单,并且每个函数在应用程序中只有一个责任。代码也很容易维护和扩展,因为我们已经分离了关注点,所以我们可以专注于每个功能。

// post.controller.ts// 导入模块
import { postServices } from '../Services/post.service'
import { Request, Response } from 'express'
import { PostschemaValidate } from '../Models/posts'class postController {// 添加帖子控制器addpost = async (req: Request, res: Response) => {// 要保存在数据库中的数据const data = {title: req.body.title,author: req.body.author,description: req.body.description,published: req.body.published,}// 验证请求const { error, value } = PostschemaValidate.validate(data)if (error) {// 处理验证错误return res.status(400).send({ message: 'Validation error', error })}const post = await postServices.createPost(value)res.send(post)}// 其他 CRUD 控制器的方法...
}// 导出类
export const PostController = new postController()
创建路由

路由是我们将使用 HTTP(POST, GET, PUT, DELETE)等方法在控制器中执行操作的地方。我们将根据每个函数创建我们的端点。

// post.routes.ts// 导入模块
import express from 'express'
import { PostController } from '../Controllers/post.controller'// 初始化路由器
export const router = express.Router()// 添加帖子路由
router.post('/', PostController.addpost)// 获取帖子
router.get('/', PostController.getPosts)// 获取单个帖子
router.get('/:id', PostController.getAPost)// 更新帖子
router.put('/:id', PostController.updatePost)// 删除帖子
router.delete('/:id', PostController.deletePost)
测试

在 Postman 或 REST 客户端上测试您的端点。

curl -X POST --data '{"title": "My Post","description": "my post description","author": "aichaoxy","published": false
}' http://localhost:7070/api/v1/postscurl -X GET http://localhost:7070/api/v1/postscurl -X PUT --data '{"title": "My Javascript Post"
}' http://localhost:7070/api/v1/posts/6421b0e73169ceabf11644e9curl -X DELETE http://localhost:7070/api/v1/posts/6421b0e73169ceabf11644e9

最后,在 mongo atlas 中检查您的 mongo 数据库中的数据。

结论

您已经创建了一个用于创建、读取、更新和从数据库中删除数据的 API。您可以查看我之前 关于 认证和授权 的帖子 。


这篇文章提供了一个完整的教程,从项目设置到测试,展示了如何使用 Express.js 和 TypeScript 创建一个 CRUD API。它包括了设置环境、安装依赖项、创建数据库连接、定义模式和模型、编写服务和控制器逻辑,以及设置路由。最后,作者还提供了如何测试 API 端点的示例。

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

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

相关文章

面试 Java 并发编程八股文十问十答第十六期

面试 Java 并发编程八股文十问十答第十六期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)final 和可以保证…

woffice– 内部网和外部网WordPress高端资讯主题

下载地址:https://m.gx.cn/site/3046.html 完全灵活,与最新的WordPress品牌兼容 翻译语言超过15种 使用最新技术设计快速web应用程序 所有这些都以谷歌材料设计为灵感,采用易于定制的设计,给人一种优美的现代感和易于导航的用户…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限,您可以使用SHOW GRANTS语句。这将列出用户的权限,包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令: SHOW GRANTS; 如果您想查看特定用户的权限,可以使用以下命令&…

让 CloudFlare 支持 Brotli 压缩算法 11 级压缩比,更节流!

站长们应该都知道 Brotli 压缩算法吧,这是一种通用的无损压缩算法。它结合使用 LZ77 算法的一个现代变体(Lempel-Ziv 编码)、霍夫曼编码和二阶上下文建模来压缩数据,提供了与当前最佳通用压缩方法相媲美的压缩比。2015 年 9 月谷歌…

笔记-跨域方式实现原理

websocket Websocket是HTML5的一个持久化的协议,它实现了浏览器与服务器的全双工通信,同时也是跨域的一种解决方案。WebSocket和HTTP都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后&#xff…

51-50 两万字长文解读ControlNet论文和代码,以及自定义模型训练和图片精确控制生成实验

今天咱们来看 ICCV2023 最佳论文Adding Conditional Control to Text-to-Image Diffusion Models,又称为ControlNet。提到图像生成Finetuning工程方法,有Textual inversion、DreamBooth、LoRA、T2I-Adapter以及ControlNet,其中最著名的当属Co…

Jupyter配置

一、修改Jupyter打开界面 (1)打开【Anaconda Prompt】,输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 (2)使用【记事本】打开 找到# c.NotebookApp.noteb…

同城预约上门服务家政小程序

基于Thinkphp和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统,用户端、服务端、门店端各端相互依赖又相互独立,支持选择项目、选择服务人员、选择门店多种下单方式,支持上门服务和到店核销两种服务方式,支持自营…

瞬息全宇宙——平行宇宙终极教程,手把手教你做出百万点赞视频

最近一种叫“瞬息全宇宙”的视频火了,抖音一期视频百万赞,各个博主视频都在带瞬息全宇宙这个标签,于是就有很多朋友催我出教程了,在琢磨了几天之后,终于整出来了 教程包含了插件的安装,界面的讲解&#xff…

C语言 | Leetcode C语言题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize < 2) {return numsSize;}int slow 2, fast 2;while (fast < numsSize) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return slow; }

Nginx线程池源码刨析

Nginx线程池源码刨析 相关的API int thread_mutex_create (pthread_mutex_t *mtx); int thread_mutex_destroy (pthread_mutex_t *mtx); int thread_mutex_lock (pthread_mutex_t *mtx); int thread_mutex_unlock (pthread_mutex_t *mtx); …

「PHP系列」PHP AJAX RSS 阅读器

文章目录 一、AJAX RSS 阅读器1. HTML结构 (index.html)2. PHP处理RSS (rss_fetcher.php)注意事项&#xff1a; 二、AJAX RSS 阅读器运用步骤 1: 设置HTML页面步骤 2: 编写PHP脚本 (rss_fetcher.php)步骤 3: 配置服务器步骤 4: 测试额外提示&#xff1a; 三、相关链接 一、AJAX…

python微信小程序 django+uniapp民宿房屋租赁短租系统

本课题主要基于微信小程序的民宿短租系统的设计&#xff0c;实现了在微信小程序里的民宿房屋的管理系统&#xff0c;系统将房屋信息发布&#xff0c;房屋租赁等功能集于一身&#xff0c;为热爱旅游的用户提供了多种多样的房屋租赁业务&#xff0c;同时也方便了房屋的拥有者发布…

问题解决记录 | 内存溢出

报错截图&#xff1a; 处理方式&#xff1a; 增大PDI工具的内存 打开Spoon.bat配置文件 修改配置

第六节笔记及作业----Lagent AgentLego 智能体应用搭建

关于 Agent 的相关理论 大语言模型存在一些局限性&#xff0c;比如会出现幻觉问题、有时效性问题以及可靠性问题。智能体的定义是具备感知、决策和行动能力的实体。智能体主要由感知部分、大脑部分和动作部分组成。智能体有多种类型&#xff0c;如 ReAct 类型&#xff08;侧重…

落地领域大模型应知必会 (1) :主要微调方法总览

在如今高速发展的人工智能领域&#xff0c;高效地利用大语言模型&#xff08;LLMs&#xff09;已经变得越来越重要。但是&#xff0c;利用大语言模型的方式太多了&#xff0c;如果你才刚刚开始接触它&#xff0c;可能会感到不知所措。 实质上&#xff0c;我们可以通过两种主要…

Github 2024-05-09 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Gin Web框架:高性能的Go HTTP框架 创建周期:3496 天开发语言:Go协议类型:MIT LicenseStar数量:73548 个Fork数量:7831 次关注人数…

项目经理必须要学会使用原型图工具或者别的必要工具吗

项目经理不一定必须学会使用原型图工具或其他特定技术工具&#xff0c;但熟悉和掌握一些关键工具和技术无疑会提高他们的工作效率和项目管理能力。以下是关于项目经理是否需要学习使用原型图工具或其他必要工具的几点考虑&#xff1a; 项目需求&#xff1a; 如果项目涉及产品设…

信创应用软件之国产邮箱

信创应用软件之国产邮箱 文章目录 信创应用软件之国产邮箱采用信创邮箱的必要性信创邮箱采购需求国产邮箱业务形态国产邮箱代表性品牌CoremailRichmail安宁eyouUMail拓波 邮件安全的发展阶段 采用信创邮箱的必要性 邮箱是天然的数据存储空间&#xff0c;党政和央国企客户在使用…

软件3班20240513

java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…