【后端】使用TS编写任务管理系统----Express

news2024/10/6 4:13:40

文章目录

    • 常见的后端框架
    • 安装并且声明文件库
    • 项目基本配置
    • 编写任务管理后端API
      • 添加任务
      • 查看任务
      • 设置任务完成状态
      • 删除任务
    • 总结

node -v
v16.13.0

https://github.com/dL-hx/server-side

常见的后端框架

  • express
  • koa

安装并且声明文件库

$ npm i express 
$ npm i @types/express -D

项目基本配置

添加ts.config

$ npx tsc --init

``

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs" /* Specify what module code is generated. */,
    "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
    "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
    "strict": true /* Enable all strict type-checking options. */,
    "skipLibCheck": true /* Skip type checking all .d.ts files. */,
    "rootDir": "./src" /* Specify the root folder within your source files. */,
    "outDir": "./dist"
  }
}

添加server文件
src/index.ts

import express from "express";
const app = express();
const port = 8000;

app.get("/hello", (req, res) => {
  res.send("hello world");
});

app.listen(port, () => {
  console.log("listening at http://localhost:" + port);
});

通过导入express对象, 并用app.get 创建 /hello 路由, 访问http://localhost:8000/hello,
服务器返回"hello world", 然后在监听8000端口提供服务

通过tsc命令, 编译src目录下所有文件, 在通过node命令启动输出后的所有的javascript文件

$ tsc
$ node dist/index.js

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYdZ4NfP-1687600002831)(Snipaste_2023-06-12_23-53-03.png)]

添加"main",与"start"字段完成项目基本配置,
后面可以直接执行npm start 命令启动服务

package.json

{
  "name": "service-side",
  "description": "[TOC]",
  "version": "1.0.0",
+ "main": "dist/index.js",
  "scripts": {
+   "start": "npx tsc && node dist/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "@types/express": "^4.17.17"
  }
}

编写任务管理后端API

安装cors库支持跨域访问

$ npm i express cors
$ npm i @types/express @types/cors -D

├─dist
├─node_modules
├─README
└─src
|—index.ts
|—TaskAccess.ts
|—type.d.ts

src/type.d.ts

interface Task {
    // id
    id:number;
    // 名称
    name:string;
    // 描述
    description: string;
    // 是否完成
    isDone:boolean;
}

// 定义了表示Task的接口,供其他Typescript文件引用

添加任务

查看任务

设置任务完成状态

删除任务

src/TaskAccess.ts

class TaskAccessor {
  tasks: Task[] = [
    {
      id: 1,
      name: "完成报告",
      description: "完成上个月报告",
      isDone: false,
    },
  ];
  taskIdIndex = 1;

  addTask(task: Task): Task {
    let newTask = {
      id: ++this.taskIdIndex,
      name: task.name,
      description: task.description,
      isDone: false,
    };
    this.tasks.push(newTask);
    return newTask;
  }

  deleteTask(taskId: number): boolean {
    let index = this.tasks.findIndex((p) => p.id == taskId);
    if (index < 0) {//未找到
      return false;
    }
    // 找到了删除
    this.tasks.splice(index, 1)
    return true;
  }

  setTaskDone(taskId:number):boolean{
    let index = this.tasks.findIndex((p) => p.id == taskId);
    if (index < 0) {// 未找到
      return false;
    }
    // 找到了,修改isDone为完成
    this.tasks[index].isDone = true
    return true;
  }
}
export const taskAccessor = new TaskAccessor();

/**
 * 该文件提供了Task数据访问功能. 声明了TaskAccessor类,在代码最后实例化了该类并将其赋值给变量taskAccessor,然后以模块形式导出
 * 
 * 下面分别介绍TaskAccessor类中的成员:
 * 
 * - task属性:用于存放Task数组,并将其中初始化一个名称为"完成报告"的Task
 * 
 * - taskIdIndex属性:用于存放当前最大的Task id,用于实现新建的Task id的自增
 * 
 * - addTask(task: Task): Task  方法:要求传入一个新增的Task对象,传入的Task对象中需要包含number ,description属性.id属性根据taskIdIndex自增,而
 * isDone属性默认为false.新的Task对象将放到tasks数组中,返回值为当前新增的Task对象.
 * 
 * - deleteTask(taskId: number): boolean方法:要求传入待删除的Task id, 返回值表示是否成功删除.如果没有找到匹配传入的id的Task,则表示删除失败.
 * 如果找到,则执行删除操作并返回true. 表示删除成功
 * 
 * - setTaskDone(taskId:number):boolean方法:要求传入已完成的Task id,返回值表示是否成功将Task 设置为已完成.如果没有找到匹配传入的id的Task,则表示设置失败,
 * 返回false.如果找到则将Task 的isDone属性设置为true并返回true
 * 
 */

src/index.ts

import express, { json } from "express";
import cors from "cors";
import { taskAccessor } from "./TaskAccess";
const app = express();
const port = 8000;

// 由于各个路由请求中都涉及了Json对象的转换,因此需要引入json中间件
app.use(express.json());

// 在前端中调用下面的API,涉及跨域访问,需引入cors中间件
app.use(cors());

app.get("/task", (req, res) => {
  res.send(taskAccessor.tasks);
});

app.post("/task", (req, res) => {
  const { name, description } = req.body;
  if (!name?.trim() || !description?.trim()) {
    return res.status(400).send('Name or description is null.')
  }
  let newTask = taskAccessor.addTask(req.body)
  res.status(200).send(newTask);
});

app.delete("/task/:id", (req, res) => {
  let deleteSuccess = taskAccessor.deleteTask(Number(req.params.id))
  if (!deleteSuccess) {
    return res.status(400).send('Task does not exist.')
  }
  res.status(200).send(deleteSuccess);
})


app.put("/task/:id", (req, res) => {
  let setSuccess = taskAccessor.setTaskDone(Number(req.params.id))
  if (!setSuccess) {
    return res.status(400).send('Task does not exist.')
  }
  res.status(200).send(setSuccess);
})


app.listen(port, () => {
  console.log("Express is listening at http://localhost:" + port);
});

/**
 * 该文件用于提供后端服务,引用TaskAccess模块来查询或修改Task数据, 并将通过不同路由发布不同的数据操作API.
 * 
 * 介绍index.ts文件中各个方法的作用:
 * -app.use(...).   引入中间件.这里引入了两个中间件,分别为json和cors.  json中间件用于处理各个路由请求中,涉及Json对象转换,
 * cors中间件用于支持前端页面以跨域形式调用各个API.
 * 
 * - app.get("/task")    获取全部的Task数据的API
 * 
 * 
 * - app.post("/task")   创建Task的API.
 * 如果传入的name属性和description属性为空值, 将返回HTTP状态码400;
 * 如果传入的Task内容正确, 则调用taskAccessor的addTask()方法新增Task,然后返回新增的Task,且HTTP状态码为200
 * 
 * 
 * - app.delete("/task/:id")   删除Task的API,将调用taskAccessor的deleteTask()方法.
 * 如果删除失败,则返回HTTP状态码400;
 * 如果成功,则返回true,且HTTP状态码为200
 * 
 * - app.put("/task/:id")   设置Task任务为已完成的API,将调用taskAccessor的setTaskDone()方法.
 * 如果设置失败,则返回HTTP状态码400;
 * 如果成功,则返回true,且HTTP状态码为200
 */

之后,你可以通过使用如Postman 等的API工具来访问这些API.
首先执行npm start命令启动后端服务.然后

  • 通过Postman 调用/task POST API,新增一个任务
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GCcPCj1W-1687600002833)(task_post.png)]

  • 调用/task/:id DELETE API, 删除一个任务
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g04gaAuV-1687600002836)(task_delete.png)]

  • 调用/task/:id PUT API, 设置任务处于完成状态
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vbg8Tapq-1687600002839)(task_put.png)]

  • 最后调用/task GET API, 获取当前的全部任务
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6Oed78U-1687600002840)(task_get.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pruHa7cw-1687600002841)(task_all.png)]

总结

  • 最后因为数据都是在内存中存入的,所以需要json文件/使用数据库保存这里的数据,做数据的持久化

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

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

相关文章

前端vue入门(纯代码)14

内容创作不易&#xff0c;各位帅哥美女&#xff0c;求个小小的赞&#xff01;&#xff01;&#xff01; 【15.给todoList案例添加编辑按钮】 本篇内容在TodoList案例的基础上添加个编辑按钮&#xff0c;要求&#xff1a; &#xff08;1&#xff09;点击编辑按钮后&#xff0c…

轻松学会研华屏幕下载和上传

&#x1f525;一个人走得远了&#xff0c;就会忘记自己为了什么而出发&#xff0c;希望你可以不忘初心&#xff0c;不要随波逐流&#xff0c;一直走下去&#x1f3b6; &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; ✅ 如果觉得博主…

HashMap和HashSet的知识点总结

前言 在之前我们介绍过TreeMap和TreeSet&#xff1a; TreeMapTreeSet 知识点梳理总结_Crystal_bit的博客-CSDN博客 也知道Key-Value和Key模型&#xff0c;但是我们可能还对Hash不太了解&#xff0c;这里我们对Hash了解之后再对HashMap和HashSet的基本使用了解一下。 目录 1…

LabVIEW 图像处理功能

设置成像系统并采集图像后&#xff0c;您可以分析和处理图像&#xff0c;以提取有关被检测对象的有价值信息。 内容 图像分析图像处理斑点分析机器视觉 图像分析 影像分析结合了基于影像像素的灰度强度计算统计数据和测量的技术。您可以使用影像分析功能来确定影像质量是否足以…

scratch lenet(10): C语言计算log

scratch lenet(10): C语言计算log 文章目录 scratch lenet(10): C语言计算log1. 目的2. 原理: x m ∗ 2 p x m * 2^p xm∗2p3. 公式展开3.1 公式分解3.2 获取 m m m3.3 获取 p p p3.4 Remez 算法Remez 算法用于 sin(x) 的快速计算Remez 算法用于 exp 的近似Remez 用于自然…

【MySQL数据库】存储过程

目录 一、存储过程1.1概述1.2优点 二、存储过程实战2.1创建存储过程2.2存储过程的参数2.3条件语句 if-then-else end if2.4循环语句while end while 一、存储过程 1.1概述 存储过程是一组为了完成特定功能的SQL语句集合。存储过程在使用过程中是将常用或者复杂的工作预先使…

CSS基础学习--25 border(边框)进阶

一、边框常见属性 border-radiusbox-shadowborder-image 属性说明CSSborder-image设置所有边框图像的速记属性。3border-radius一个用于设置所有四个边框- *-半径属性的速记属性3box-shadow附加一个或多个下拉框的阴影3 二、border-radius 圆角 在 CSS2 中添加圆角棘手。我…

网络协议TCP/IP 协议学习笔记一

T C P / I P通常被认 为是一个四层协议系统&#xff0c;每一层负责不同的功能&#xff1a; 1) 链路层&#xff0c;有时也称作数据链路层或网络接口层&#xff0c; 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡。它们一起处理与电缆&#xff08;或其他任何传输…

CSS基础学习--26 渐变(Gradients)

CSS3 渐变&#xff08;gradients&#xff09;可以让你在两个或多个指定的颜色之间显示平稳的过渡。以前&#xff0c;你必须使用图像来实现这些效果。但是&#xff0c;通过使用 CSS3 渐变&#xff08;gradients&#xff09;&#xff0c;你可以减少下载的时间和宽带的使用。此外&…

Linux tracing之基于uprobe/kprobe的调试调优浅析

经过长期的发展, kprobes/uprobes 机制在事件(events)的基础上分别为内核态和用户态提供了追踪调试的功能, 这也构成了 tracepoint 机制的基础, 后期的很多工具, 比如 perf_events, ftrace 等都是在其基础上演化而来. 参考由 Brendan Gregg 提供的资料来看, kprobes/uprobes 在…

Minecraft我的世界服务器搭建之Linux系统,我的世界服务器推荐

Minecraft 是一个流行的沙箱独立游戏&#xff0c;由瑞典程序员 Markus “Notch” Perssion 首先创造&#xff0c;后来由 Mojang 开发并发布。这是一款关于打碎和放置砖块的游戏。首先&#xff0c;人们建造建筑物来抵抗夜晚的怪物&#xff0c;随着游戏的发展&#xff0c;玩家一起…

Spark Stream操作Kafka总结

kafka集群搭建 搭建参考 https://www.toutiao.com/article/6496743889053942286/?log_fromd5d6394cf75d_1687599146327 zk下载位置 国内&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 国外&#xff1a;Apache ZooKeeper kafka位置 国内&#xff…

Kubernetes(k8s)容器编排Pod介绍和使用

目录 1 Pod 特点1.1 网络1.2 存储 2 使用方式2.1 自主式Pod2.2 控制器管理的Pod 3 自主运行Pod3.1 创建资源清单3.1.1 参数描述 3.2 创建Pod3.3 Pod操作3.3.1 查看Pod列表3.3.2 查看描述信息3.3.3 访问pod3.3.4 删除Pod 4 控制器运行Pod4.1 创建资源清单4.2 参数描述4.2.1 Repl…

【IDEA】Directory创建多级目录的正确写法

在resource下创建包的时候&#xff0c;右键resourcenew的时候并没有Package,只有Directory 我们也可以用Directory创建包&#xff0c;但写法与在Package下创建包的写法会不一样 例如&#xff1a; 在directory创建包 我们在去看文件的时候 如果是用&#xff08; com.dao.m…

【数据结构】树以及堆的讲解

(这里写自定义目录标题) 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树的概念&#xff1f;二、树的表示方法三、树的实际应用四、二叉树概念以及结构1.概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储…

指针与数组--动态数组(2)[1、长度可变的一维动态数组 2、长度可变的二维动态数组]

目录 一、长度可变的一维动态数组 二、长度可变的二维动态数组 由上篇文章的理论&#xff0c;接下来使用例题来阐述。 一、长度可变的一维动态数组 例题1、编程输入某班学生的某门课成绩&#xff0c;计算并输出平均值。学生人数由键盘输入。 #include <stdio.h> #i…

Apache服务器

文章目录 Apache服务器Linux安装ApacheApache文件结构Apache主配置文件案例 配置一台Web服务器 启动用户的个人网站虚拟主机的设定基于IP的虚拟主机基于域名的虚拟主机基于端口的虚拟主机 rewrite重写rewrite使用详解使用案例 域名跳转单个域名跳转多个域名跳转 status状态页ap…

“插入排序:小数据量排序的王者“

文章目录 &#x1f50d;什么是插入排序&#xff1f;&#x1f511;插入排序的优缺点&#x1f680;实现插入排序 &#x1f50d;什么是插入排序&#xff1f; 插入排序是一种简单的排序算法&#xff0c;它的基本思想是&#xff1a;将待排序的元素&#xff0c;从第二个元素开始&…

阿里架构师整理的Java经典面试题1220道(附答案)

学习如逆水行舟&#xff0c;尤其是 IT 行业有着日新月异的节奏&#xff0c;我们更要抓紧每一次可以学习和进步的机会。所以&#xff0c;没有撤退可言 即使是面试跳槽&#xff0c;那也是一个学习的过程。只有全面的复习&#xff0c;才能让我们更好的充实自己&#xff0c;武装自…

内网隧道代理技术(五)之 Netcat反弹Shell

Netcat反弹Shell Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、反弹Shell、端口监听和文件传输等操作,常用参数如下&#xff1a; 参数作用-c指定连接后要执行的shell命令-e指定连接后要执行的文件名-k配置 Socket一直存活(若不想…