【Javascrip】Javascript练习01 REST API using Express.js.

针对该问题的项目路径
在这里插入图片描述

在这里插入图片描述
要求部分
what you need to doReview the tasks provided in the section below.Obtain the boilerplate code.Use your local development environment to implement a solution.Upload your solution for marking via Gradescope. There is no attempt limit.

The tasks
Create your first REST API using Express.js.

The purpose of this application is to manage drivers of vehicles. You do not need to manage the vehicles; only the drivers.

A Driver has: first_name, last_name, and licence_number.

When identifying a specific driver, use their licence number rather than an arbitrary, generated ID.

You will implement:

GET /api/drivers to fetch all drivers.
GET /api/drivers/:id to fetch a particular driver.
POST /api/drivers to create a new driver.
PUT /api/drivers/:id to update an existing driver.
DELETE /api/drivers/:id to remove an existing driver.

1.0 Initialise a new node project (1 mark)
npm init
Gradescope will validate your package.json file. It must contain at least:

name
version
description
author
main
dependencies: express
Note: Gradescope will not install the packages listed in your package.json file, as it already has Express.js installed. However, you must list express as a dependency. You do not need any other packages.

2.0 Structure the application source code (1 mark)
At the root of your npm project, create a file server.js. That is the entry-point to your program. Gradescope will launch your server application by running node server.js.

At the root of your project, create a directory named src and within that, three directories: controllers, middleware and routes.

Create a controller named driver.js.

Create a middleware named mediaTypeValidator.js.

Create routers named index.js and driver.js.

在这里插入图片描述

3.0 Implement server.js (1 mark)
You must import the express package then create an express app that listens for incoming connections on port 3000.

Below is boilerplate code. It is not the final solution to the assignment but will help you get started.

To check your server is running, Gradescope will request GET http://localhost:3000/ and expect Hello, IFN666! in return.

const express = require(“express”);

// Put your code here

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

const port = 3000;

// Put your code here

app.listen(port, () => {
console.log(Server is listening on :${port})
});

module.exports = app;

4.0 Create routes (2 marks)
Your API must respond to requests at /api.

The file ./server.js should route requests on http://localhost:3000/api to the router in routes/index.js.

The router in routes/index.js should route /api/driver requests to the router in routes/driver.js.

Here are four independent lines of code that will help. Your task is to implement them accordingly.

const apiRouter = require(“./src/routes/index”);
app.use(‘/api’, apiRouter);
const driverRouter = require(“./driver”);
router.use(‘/drivers’, driverRouter);
In src/routes/driver.js, declare the Express methods for listing, creating, updating and deleting drivers.

Here is one example. You will need to implement four others.

router.put(“/:id”, controller.update);
Gradescope will check the structure of your API and award marks when the endpoints are not returning 404 Not Found.

5.0 Create a driver controller (4 marks)
In src/controllers, create a file named driver.js.

You will use an in-memory array to store drivers. You will not use a database. The drawback of this is that your list of drivers will be lost when the node application ends (despite whether it ends gracefully or because it failed). In the next assessment, you must definitely use a database. For the purpose of this assessment item, we are simplifying the task by having you use fewer technologies.

You will need to implement five methods:

5.1 getAll which responds to a request for all drivers (0.5 mark).
5.2 get which responds to a request for a particular driver (0.5 mark).
5.3 create which responds to a request for creating a driver (1 mark).
5.4 update which responds to a request for updating a driver (1 mark).
5.5 delete which responds to a request for removing a driver (1 mark).
When identifying a specific driver, use their licence number rather than an arbitrary, generated ID.

If a driver cannot be found, return HTTP status code 204 No Content.

If the identifier of a driver is not provided, return HTTP status code 400 Bad Request.

If the driver already exists, return HTTP status code 409 Conflict.

If the driver is successfully created, return HTTP status code 201 Created.

If the driver is successfully updated or deleted, return HTTP status code 200 OK.

If any required fields (first name, last name, licence number) are missing, return HTTP status code 400 Bad Request.

const drivers = [];

exports.getAll = async (req, res) => {
// Put your code here
};

exports.get = async (req, res) => {
const { id } = req.params;

// Put your code here

};

exports.create = async (req, res) => {
const { first_name, last_name, licence_number } = req.body;

// Put your code here

};

exports.update = async (req, res) => {
const { id } = req.params;
const { first_name, last_name } = req.body;

// Put your code here

};

exports.delete = async (req, res) => {
const { id } = req.params;

// Put your code here

};

6.0 Add middleware (1 mark)
Create a middleware named mediaTypeValidator.js which responds with a HTTP status code of 415 Unsupported Media Type if a request that sends a body does not specify the content-type of application/json.

Specifications
Gradescope has installed:

Node.js version 22.0.0
Express.js version 4.21.2

以下是对你提供的任务描述的分析和讲解,包括每一段用到的技术、关联、含义以及代码路径的解释。


1. 学习目标

  • 核心标准和平台:掌握 Web 和移动计算的核心标准和平台(如 Node.js、Express.js)。
  • 复杂应用开发:通过开发一个管理司机的 REST API,学习如何解决现实世界中的问题。

2. 任务概述

你需要使用 Node.js 和 Express.js 创建一个 REST API,用于管理司机信息。司机信息包括 first_namelast_namelicence_number。API 需要支持以下操作:

  • 获取所有司机
  • 获取特定司机
  • 创建新司机
  • 更新司机信息
  • 删除司机

3. 任务详解

3.1 初始化 Node 项目 (1 分)
  • 技术npm init
  • 含义:初始化一个新的 Node.js 项目,生成 package.json 文件。
  • 代码路径
    npm init
    
  • package.json 要求
    • name:项目名称
    • version:项目版本
    • description:项目描述
    • author:作者信息
    • main:入口文件(server.js
    • dependencies:必须包含 express

3.2 项目结构 (1 分)
  • 技术:项目结构设计
  • 含义:合理的项目结构有助于代码的可维护性和扩展性。
  • 代码路径
    .
    ├── package.json
    ├── server.js
    └── src├── controllers│   └── driver.js├── middleware│   └── mediaTypeValidator.js└── routes├── index.js└── driver.js
    
  • 解释
    • server.js:入口文件,启动 Express 服务器。
    • src/controllers/driver.js:司机相关的业务逻辑。
    • src/middleware/mediaTypeValidator.js:中间件,用于验证请求的 Content-Type
    • src/routes/index.jssrc/routes/driver.js:路由文件,定义 API 端点。

3.3 实现 server.js (1 分)
  • 技术:Express.js
  • 含义:创建 Express 应用并监听端口 3000。
  • 代码路径
    const express = require("express");
    const app = express();app.use(express.json());
    app.use(express.urlencoded({ extended: true }));const port = 3000;app.get("/", (req, res) => {res.send("Hello, IFN666!");
    });app.listen(port, () => {console.log(`Server is listening on :${port}`);
    });module.exports = app;
    
  • 解释
    • express.json()express.urlencoded():解析请求体中的 JSON 和 URL 编码数据。
    • app.get("/", ...):根路由,返回 “Hello, IFN666!”。
    • app.listen(port, ...):启动服务器,监听端口 3000。

3.4 创建路由 (2 分)
  • 技术:Express 路由
  • 含义:定义 API 的路由结构。
  • 代码路径
    • server.js
      const apiRouter = require("./src/routes/index");
      app.use('/api', apiRouter);
      
    • src/routes/index.js
      const express = require("express");
      const router = express.Router();
      const driverRouter = require("./driver");router.use('/drivers', driverRouter);module.exports = router;
      
    • src/routes/driver.js
      const express = require("express");
      const router = express.Router();
      const controller = require("../controllers/driver");router.get("/", controller.getAll);
      router.get("/:id", controller.get);
      router.post("/", controller.create);
      router.put("/:id", controller.update);
      router.delete("/:id", controller.delete);module.exports = router;
      
  • 解释
    • /api 路由指向 src/routes/index.js
    • /api/drivers 路由指向 src/routes/driver.js
    • driver.js 中定义了具体的 API 端点(GET、POST、PUT、DELETE)。

3.5 创建司机控制器 (4 分)
  • 技术:Express 控制器
  • 含义:实现司机相关的业务逻辑。
  • 代码路径src/controllers/driver.js
    const drivers = [];exports.getAll = async (req, res) => {res.status(200).json(drivers);
    };exports.get = async (req, res) => {const { id } = req.params;const driver = drivers.find(d => d.licence_number === id);if (!driver) return res.status(204).send();res.status(200).json(driver);
    };exports.create = async (req, res) => {const { first_name, last_name, licence_number } = req.body;if (!first_name || !last_name || !licence_number) return res.status(400).send();if (drivers.some(d => d.licence_number === licence_number)) return res.status(409).send();drivers.push({ first_name, last_name, licence_number });res.status(201).json({ first_name, last_name, licence_number });
    };exports.update = async (req, res) => {const { id } = req.params;const { first_name, last_name } = req.body;const driver = drivers.find(d => d.licence_number === id);if (!driver) return res.status(204).send();driver.first_name = first_name;driver.last_name = last_name;res.status(200).json(driver);
    };exports.delete = async (req, res) => {const { id } = req.params;const index = drivers.findIndex(d => d.licence_number === id);if (index === -1) return res.status(204).send();drivers.splice(index, 1);res.status(200).send();
    };
    
  • 解释
    • getAll:返回所有司机。
    • get:根据 licence_number 查找司机。
    • create:创建新司机。
    • update:更新司机信息。
    • delete:删除司机。

3.6 添加中间件 (1 分)
  • 技术:Express 中间件
  • 含义:验证请求的 Content-Type
  • 代码路径src/middleware/mediaTypeValidator.js
    const mediaTypeValidator = (req, res, next) => {if (req.method === "POST" || req.method === "PUT") {if (!req.is("application/json")) {return res.status(415).send();}}next();
    };module.exports = mediaTypeValidator;
    
  • 解释
    • 如果请求方法是 POSTPUT,检查 Content-Type 是否为 application/json
    • 如果不是,返回 415 Unsupported Media Type

4. 提交要求

  • 提交内容:将整个项目打包为 ZIP 文件(不包括 node_modules)。
  • 文件结构
    .
    ├── package.json
    ├── server.js
    └── src├── controllers│   └── driver.js├── middleware│   └── mediaTypeValidator.js└── routes├── index.js└── driver.js
    

5. 总结

  • 通过这个任务,你学习了如何使用 Node.js 和 Express.js 构建 REST API。
  • 项目结构的设计和代码的组织方式是为了提高代码的可维护性和扩展性。
  • 每个模块(路由、控制器、中间件)都有明确的职责,符合单一职责原则。

要通过每一项的测试在这里插入图片描述

driver.js部分的代码

const drivers = [];exports.getAll = async (req, res) => {res.status(200).json(drivers);
};exports.get = async (req, res) => {const { id } = req.params;if (!id) return res.status(400).send();const driver = drivers.find(d => d.licence_number == id); if (!driver) return res.status(204).send();res.status(200).json(driver);
};exports.create = async (req, res) => {const { first_name, last_name, licence_number } = req.body;if (!first_name || !last_name || !licence_number) {return res.status(400).json({ error: 'Missing required fields' });}const exists = drivers.some(d => d.licence_number == licence_number); if (exists) return res.status(409).json({ error: 'Driver already exists' });const newDriver = { first_name, last_name, licence_number };drivers.push(newDriver);res.status(201).json(newDriver);
};exports.update = async (req, res) => {const { id } = req.params;const { first_name, last_name } = req.body;if (!id || !first_name || !last_name) {return res.status(400).json({ error: 'Missing required fields' });}const index = drivers.findIndex(d => d.licence_number == id); if (index == -1) return res.status(204).send(); drivers[index] = { ...drivers[index], first_name, last_name };res.status(200).json(drivers[index]);
};exports.delete = async (req, res) => {const { id } = req.params;if (!id) return res.status(400).json({ error: 'Missing licence number' });const index = drivers.findIndex(d => d.licence_number == id); if (index == -1) return res.status(204).send(); drivers.splice(index, 1);res.status(200).json({ message: 'Driver deleted successfully' });
};

以下是对你提供的代码的详细讲解,包括每一行代码的作用、符号和语句的含义,以及与其他文件的关联。


1. 代码概述

这段代码实现了一个简单的司机管理系统的控制器逻辑。它使用一个内存数组 drivers 来存储司机信息,并提供了以下功能:

  • 获取所有司机
  • 获取特定司机
  • 创建新司机
  • 更新司机信息
  • 删除司机

2. 代码逐行讲解

2.1 初始化司机数组
const drivers = [];
  • 作用:定义一个空数组 drivers,用于存储司机信息。
  • 关联:这个数组是内存中的临时存储,服务器重启后数据会丢失。

2.2 获取所有司机
exports.getAll = async (req, res) => {res.status(200).json(drivers);
};
  • 作用:处理 GET /api/drivers 请求,返回所有司机信息。
  • 逐行分析
    • exports.getAll:将 getAll 方法导出,供路由文件调用。
    • async (req, res):定义一个异步函数,req 是请求对象,res 是响应对象。
    • res.status(200).json(drivers):设置 HTTP 状态码为 200(成功),并返回 drivers 数组的 JSON 格式数据。
  • 关联:在 src/routes/driver.js 中,router.get("/", controller.getAll) 会调用此方法。

2.3 获取特定司机
exports.get = async (req, res) => {const { id } = req.params;if (!id) return res.status(400).send();const driver = drivers.find(d => d.licence_number == id); if (!driver) return res.status(204).send();res.status(200).json(driver);
};
  • 作用:处理 GET /api/drivers/:id 请求,返回特定司机的信息。
  • 逐行分析
    • const { id } = req.params:从请求参数中提取 id(即 licence_number)。
    • if (!id) return res.status(400).send():如果 id 不存在,返回 400(错误请求)。
    • const driver = drivers.find(d => d.licence_number == id):在 drivers 数组中查找 licence_number 等于 id 的司机。
    • if (!driver) return res.status(204).send():如果未找到司机,返回 204(无内容)。
    • res.status(200).json(driver):返回找到的司机信息。
  • 关联:在 src/routes/driver.js 中,router.get("/:id", controller.get) 会调用此方法。

2.4 创建新司机
exports.create = async (req, res) => {const { first_name, last_name, licence_number } = req.body;if (!first_name || !last_name || !licence_number) {return res.status(400).json({ error: 'Missing required fields' });}const exists = drivers.some(d => d.licence_number == licence_number); if (exists) return res.status(409).json({ error: 'Driver already exists' });const newDriver = { first_name, last_name, licence_number };drivers.push(newDriver);res.status(201).json(newDriver);
};
  • 作用:处理 POST /api/drivers 请求,创建新司机。
  • 逐行分析
    • const { first_name, last_name, licence_number } = req.body:从请求体中提取司机信息。
    • if (!first_name || !last_name || !licence_number):检查必填字段是否缺失,如果缺失则返回 400(错误请求)。
    • const exists = drivers.some(d => d.licence_number == licence_number):检查 licence_number 是否已存在。
    • if (exists) return res.status(409).json({ error: 'Driver already exists' }):如果司机已存在,返回 409(冲突)。
    • const newDriver = { first_name, last_name, licence_number }:创建新司机对象。
    • drivers.push(newDriver):将新司机添加到 drivers 数组。
    • res.status(201).json(newDriver):返回 201(已创建)和新司机的信息。
  • 关联:在 src/routes/driver.js 中,router.post("/", controller.create) 会调用此方法。

2.5 更新司机信息
exports.update = async (req, res) => {const { id } = req.params;const { first_name, last_name } = req.body;if (!id || !first_name || !last_name) {return res.status(400).json({ error: 'Missing required fields' });}const index = drivers.findIndex(d => d.licence_number == id); if (index == -1) return res.status(204).send(); drivers[index] = { ...drivers[index], first_name, last_name };res.status(200).json(drivers[index]);
};
  • 作用:处理 PUT /api/drivers/:id 请求,更新司机信息。
  • 逐行分析
    • const { id } = req.params:从请求参数中提取 id
    • const { first_name, last_name } = req.body:从请求体中提取更新的信息。
    • if (!id || !first_name || !last_name):检查必填字段是否缺失,如果缺失则返回 400(错误请求)。
    • const index = drivers.findIndex(d => d.licence_number == id):查找司机的索引。
    • if (index == -1) return res.status(204).send():如果未找到司机,返回 204(无内容)。
    • drivers[index] = { ...drivers[index], first_name, last_name }:更新司机信息。
    • res.status(200).json(drivers[index]):返回更新后的司机信息。
  • 关联:在 src/routes/driver.js 中,router.put("/:id", controller.update) 会调用此方法。

2.6 删除司机
exports.delete = async (req, res) => {const { id } = req.params;if (!id) return res.status(400).json({ error: 'Missing licence number' });const index = drivers.findIndex(d => d.licence_number == id); if (index == -1) return res.status(204).send(); drivers.splice(index, 1);res.status(200).json({ message: 'Driver deleted successfully' });
};
  • 作用:处理 DELETE /api/drivers/:id 请求,删除司机。
  • 逐行分析
    • const { id } = req.params:从请求参数中提取 id
    • if (!id) return res.status(400).json({ error: 'Missing licence number' }):如果 id 不存在,返回 400(错误请求)。
    • const index = drivers.findIndex(d => d.licence_number == id):查找司机的索引。
    • if (index == -1) return res.status(204).send():如果未找到司机,返回 204(无内容)。
    • drivers.splice(index, 1):从数组中删除司机。
    • res.status(200).json({ message: 'Driver deleted successfully' }):返回删除成功的消息。
  • 关联:在 src/routes/driver.js 中,router.delete("/:id", controller.delete) 会调用此方法。

3. 代码与其他文件的关联

  • src/routes/driver.js
    • 定义了路由 /api/drivers/api/drivers/:id
    • 调用 controller.getAllcontroller.getcontroller.createcontroller.updatecontroller.delete
  • server.js
    • 启动 Express 服务器,并将 /api 路由指向 src/routes/index.js
  • src/routes/index.js
    • /api/drivers 路由指向 src/routes/driver.js

4. 总结

  • 这段代码实现了司机管理系统的核心逻辑,包括增删改查操作。
  • 通过 exports 导出方法,供路由文件调用。
  • 使用内存数组 drivers 存储数据,适合小型应用或测试场景。
  • 代码结构清晰,符合 RESTful API 设计规范。

第二部分代码 关于mediaTypeValidator

module.exports = function mediaTypeValidator(req, res, next) {
const methodsWithBody = [‘POST’, ‘PUT’, ‘PATCH’];
if (methodsWithBody.includes(req.method)) {
const contentType = req.get(‘Content-Type’);
if (!contentType || !contentType.includes(‘application/json’)) {
return res.status(415).json({ error: ‘Unsupported Media Type: Content-Type must be application/json’ });
}
}
next();
};

以下是对你提供的 mediaTypeValidator 中间件代码的详细讲解,包括每一行代码的作用、符号和语句的含义,以及与其他文件的关联。


1. 代码概述

这段代码实现了一个 Express 中间件,用于验证请求的 Content-Type 是否为 application/json。如果请求方法是 POSTPUTPATCH,并且 Content-Type 不是 application/json,则返回 415 Unsupported Media Type 错误。


2. 代码逐行讲解

2.1 导出中间件函数
module.exports = function mediaTypeValidator(req, res, next) {
  • 作用:将 mediaTypeValidator 函数导出,供其他文件使用。
  • 符号和语句
    • module.exports:Node.js 的模块导出语法,用于将函数、对象或变量导出。
    • function mediaTypeValidator(req, res, next):定义一个中间件函数,接收三个参数:
      • req:请求对象,包含客户端发送的请求信息。
      • res:响应对象,用于向客户端发送响应。
      • next:回调函数,用于将控制权传递给下一个中间件或路由处理函数。

2.2 定义需要检查的 HTTP 方法
  const methodsWithBody = ['POST', 'PUT', 'PATCH'];
  • 作用:定义一个数组 methodsWithBody,包含需要检查 Content-Type 的 HTTP 方法。
  • 符号和语句
    • const:声明一个常量,值不可变。
    • methodsWithBody:数组变量,存储需要检查的 HTTP 方法。

2.3 检查请求方法
  if (methodsWithBody.includes(req.method)) {
  • 作用:检查当前请求方法是否在 methodsWithBody 数组中。
  • 符号和语句
    • if:条件语句,用于判断条件是否成立。
    • methodsWithBody.includes(req.method):检查 req.method(当前请求的 HTTP 方法)是否在 methodsWithBody 数组中。
      • req.method:获取当前请求的 HTTP 方法(如 GETPOST 等)。
      • includes:数组方法,用于检查数组中是否包含某个值。

2.4 获取并检查 Content-Type
    const contentType = req.get('Content-Type');if (!contentType || !contentType.includes('application/json')) {
  • 作用:获取请求头中的 Content-Type,并检查是否为 application/json
  • 符号和语句
    • const contentType = req.get('Content-Type'):从请求头中获取 Content-Type 的值。
      • req.get('Content-Type'):获取请求头中 Content-Type 字段的值。
    • if (!contentType || !contentType.includes('application/json')):检查 Content-Type 是否存在,并且是否包含 application/json
      • !contentType:检查 contentType 是否为 nullundefined
      • contentType.includes('application/json'):检查 contentType 是否包含 application/json

2.5 返回错误响应
      return res.status(415).json({ error: 'Unsupported Media Type: Content-Type must be application/json' });
  • 作用:如果 Content-Type 不符合要求,返回 415 Unsupported Media Type 错误。
  • 符号和语句
    • return:终止函数执行并返回值。
    • res.status(415):设置 HTTP 状态码为 415(不支持的媒体类型)。
    • res.json({ error: '...' }):返回 JSON 格式的错误信息。

2.6 调用下一个中间件
  }next();
};
  • 作用:如果 Content-Type 检查通过,调用 next() 将控制权传递给下一个中间件或路由处理函数。
  • 符号和语句
    • next():调用下一个中间件或路由处理函数。
    • }:结束 if 语句和函数定义。

3. 代码与其他文件的关联

3.1 与 server.js 的关联

server.js 中,mediaTypeValidator 中间件会被注册为全局中间件或特定路由的中间件。例如:

const express = require('express');
const app = express();
const mediaTypeValidator = require('./src/middleware/mediaTypeValidator');// 注册为全局中间件
app.use(mediaTypeValidator);// 或者注册为特定路由的中间件
app.post('/api/drivers', mediaTypeValidator, (req, res) => {// 处理 POST 请求
});
3.2 与 routes/driver.js 的关联

routes/driver.js 中,mediaTypeValidator 中间件可以用于保护特定路由。例如:

const express = require('express');
const router = express.Router();
const mediaTypeValidator = require('../middleware/mediaTypeValidator');
const controller = require('../controllers/driver');// 注册为特定路由的中间件
router.post('/', mediaTypeValidator, controller.create);
router.put('/:id', mediaTypeValidator, controller.update);

4. 总结

  • 功能mediaTypeValidator 中间件用于验证请求的 Content-Type,确保其为 application/json
  • 适用场景:适用于需要处理 JSON 数据的 POSTPUTPATCH 请求。
  • 与其他文件的关联
    • server.js 中注册为全局中间件或特定路由的中间件。
    • routes/driver.js 中用于保护特定路由。

route中的driverjs

const express = require(‘express’);
const router = express.Router();
const controller = require(‘…/controllers/driver’);

router.get(‘/’, controller.getAll);
router.get(‘/:id’, controller.get);
router.post(‘/’, controller.create);
router.put(‘/:id’, controller.update);
router.delete(‘/:id’, controller.delete);

module.exports = router;

以下是对 routes/driver.js 文件的 逐行详细讲解,包括每一行代码的关系、符号和语句的作用,以及与其他文件的关联。


1. 代码概述

这段代码定义了一个 Express 路由器,用于处理与司机相关的 HTTP 请求。它将不同的 HTTP 方法(GETPOSTPUTDELETE)映射到相应的控制器方法。


2. 代码逐行讲解

2.1 导入 Express 和路由器
const express = require('express');
const router = express.Router();
  • 作用:导入 Express 模块并创建一个路由器实例。
  • 符号和语句
    • const express = require('express'):导入 Express 模块。
      • require('express'):Node.js 的模块导入语法,用于加载 Express 模块。
    • const router = express.Router():创建一个 Express 路由器实例。
      • express.Router():用于定义路由的 Express 方法。
  • 与其他文件的关联
    • server.js 中,这个路由器会被注册到 /api/drivers 路径。

2.2 导入控制器
const controller = require('../controllers/driver');
  • 作用:导入司机相关的控制器方法。
  • 符号和语句
    • const controller = require('../controllers/driver'):从 ../controllers/driver.js 文件中导入控制器。
      • require('../controllers/driver'):加载 driver.js 文件,并获取其导出的对象。
  • 与其他文件的关联
    • controller 对象包含了 getAllgetcreateupdatedelete 方法,这些方法在 controllers/driver.js 中定义。

2.3 定义路由
router.get('/', controller.getAll);
router.get('/:id', controller.get);
router.post('/', controller.create);
router.put('/:id', controller.update);
router.delete('/:id', controller.delete);
  • 作用:将 HTTP 方法与控制器方法绑定。
  • 符号和语句
    • router.get('/', controller.getAll):将 GET / 请求映射到 controller.getAll 方法。
      • router.get:定义处理 GET 请求的路由。
      • '/':路由路径,表示根路径。
      • controller.getAll:处理该请求的控制器方法。
    • router.get('/:id', controller.get):将 GET /:id 请求映射到 controller.get 方法。
      • '/:id':动态路由路径,:id 是一个占位符,表示司机的 licence_number
    • router.post('/', controller.create):将 POST / 请求映射到 controller.create 方法。
      • router.post:定义处理 POST 请求的路由。
    • router.put('/:id', controller.update):将 PUT /:id 请求映射到 controller.update 方法。
      • router.put:定义处理 PUT 请求的路由。
    • router.delete('/:id', controller.delete):将 DELETE /:id 请求映射到 controller.delete 方法。
      • router.delete:定义处理 DELETE 请求的路由。
  • 与其他文件的关联
    • 这些路由定义了 API 的端点,客户端可以通过这些端点与服务器交互。
    • 每个路由对应的控制器方法在 controllers/driver.js 中实现。

2.4 导出路由器
module.exports = router;
  • 作用:将路由器实例导出,供其他文件使用。
  • 符号和语句
    • module.exports = router:将 router 对象导出。
      • module.exports:Node.js 的模块导出语法,用于将对象、函数或变量导出。
  • 与其他文件的关联
    • server.jsroutes/index.js 中,通过 require 引入并使用此路由器。

3. 代码与其他文件的关联

3.1 与 server.js 的关联

server.js 中,driver.js 路由器会被注册到 /api/drivers 路径。例如:

const express = require('express');
const app = express();
const driverRouter = require('./routes/driver');// 注册路由器
app.use('/api/drivers', driverRouter);
3.2 与 controllers/driver.js 的关联

controllers/driver.js 中,定义了处理请求的具体逻辑。例如:

const drivers = [];exports.getAll = async (req, res) => {res.status(200).json(drivers);
};exports.get = async (req, res) => {const { id } = req.params;const driver = drivers.find(d => d.licence_number == id);if (!driver) return res.status(204).send();res.status(200).json(driver);
};// 其他方法...
3.3 与 routes/index.js 的关联

routes/index.js 中,driver.js 路由器可能会被进一步组织。例如:

const express = require('express');
const router = express.Router();
const driverRouter = require('./driver');// 将 /drivers 路径映射到 driverRouter
router.use('/drivers', driverRouter);module.exports = router;

4. 总结

  • 功能routes/driver.js 文件定义了与司机相关的 API 端点,并将请求映射到相应的控制器方法。
  • 与其他文件的关联
    • server.js 中注册为 /api/drivers 路由。
    • 使用 controllers/driver.js 中的方法处理请求。
    • routes/index.js 中可能被进一步组织。
const express = require('express');
const router = express.Router();
const driverRouter = require('./driver');router.use('/drivers', driverRouter);
module.exports = router;

以下是对 routes/index.js 文件的 逐行详细讲解,包括每一行代码的关系、符号和语句的作用,以及与其他文件的关联。


1. 代码概述

这段代码定义了一个 Express 路由器,用于组织和管理多个子路由。它将 /drivers 路径映射到 driverRouter,从而实现对司机相关 API 的统一管理。


2. 代码逐行讲解

2.1 导入 Express 和路由器
const express = require('express');
const router = express.Router();
  • 作用:导入 Express 模块并创建一个路由器实例。
  • 符号和语句
    • const express = require('express'):导入 Express 模块。
      • require('express'):Node.js 的模块导入语法,用于加载 Express 模块。
    • const router = express.Router():创建一个 Express 路由器实例。
      • express.Router():用于定义路由的 Express 方法。
  • 与其他文件的关联
    • server.js 中,这个路由器会被注册到 /api 路径。

2.2 导入子路由
const driverRouter = require('./driver');
  • 作用:导入司机相关的子路由。
  • 符号和语句
    • const driverRouter = require('./driver'):从 ./driver.js 文件中导入子路由。
      • require('./driver'):加载 driver.js 文件,并获取其导出的路由器实例。
  • 与其他文件的关联
    • driverRouter 是在 routes/driver.js 中定义的路由器,用于处理司机相关的请求。

2.3 将子路由映射到路径
router.use('/drivers', driverRouter);
  • 作用:将 /drivers 路径映射到 driverRouter
  • 符号和语句
    • router.use('/drivers', driverRouter):将 /drivers 路径与 driverRouter 绑定。
      • router.use:用于将路径与子路由或中间件绑定。
      • '/drivers':路径前缀,表示所有以 /drivers 开头的请求都会由 driverRouter 处理。
      • driverRouter:子路由实例,处理具体的请求逻辑。
  • 与其他文件的关联
    • routes/driver.js 中,driverRouter 定义了具体的 API 端点(如 //:id)。

2.4 导出路由器
module.exports = router;
  • 作用:将路由器实例导出,供其他文件使用。
  • 符号和语句
    • module.exports = router:将 router 对象导出。
      • module.exports:Node.js 的模块导出语法,用于将对象、函数或变量导出。
  • 与其他文件的关联
    • server.js 中,通过 require 引入并使用此路由器。

3. 代码与其他文件的关联

3.1 与 server.js 的关联

server.js 中,index.js 路由器会被注册到 /api 路径。例如:

const express = require('express');
const app = express();
const apiRouter = require('./routes/index');// 注册路由器
app.use('/api', apiRouter);
3.2 与 routes/driver.js 的关联

routes/driver.js 中,定义了司机相关的 API 端点。例如:

const express = require('express');
const router = express.Router();
const controller = require('../controllers/driver');router.get('/', controller.getAll);
router.get('/:id', controller.get);
router.post('/', controller.create);
router.put('/:id', controller.update);
router.delete('/:id', controller.delete);module.exports = router;
3.3 与 controllers/driver.js 的关联

controllers/driver.js 中,定义了处理请求的具体逻辑。例如:

const drivers = [];exports.getAll = async (req, res) => {res.status(200).json(drivers);
};exports.get = async (req, res) => {const { id } = req.params;const driver = drivers.find(d => d.licence_number == id);if (!driver) return res.status(204).send();res.status(200).json(driver);
};// 其他方法...

4. 总结

  • 功能routes/index.js 文件用于组织和管理多个子路由,将 /drivers 路径映射到 driverRouter
  • 与其他文件的关联
    • server.js 中注册为 /api 路由。
    • 使用 routes/driver.js 中的路由器处理司机相关的请求。
    • 使用 controllers/driver.js 中的方法处理具体的业务逻辑。
package.jason{"name": "c","version": "1.0.0","main": "server.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "node server.js"},"keywords": [],"author": "","license": "ISC","dependencies": {"a": "file:","express": "^4.21.2"},"description": ""
}

以下是对 package.json 文件的 逐行详细讲解,包括每一行代码的关系、符号和语句的作用,以及与其他文件的关联。


1. 代码概述

package.json 是 Node.js 项目的配置文件,用于定义项目的元数据、依赖项、脚本等信息。它是 Node.js 项目的核心文件之一。


2. 代码逐行讲解

2.1 项目名称
  "name": "c",
  • 作用:定义项目的名称。
  • 符号和语句
    • "name":键,表示项目名称。
    • "c":值,表示项目的名称。这里名称是 c,通常建议使用更具描述性的名称。
  • 与其他文件的关联
    • 项目名称在发布到 npm 时使用,或者在本地开发中作为标识。

2.2 项目版本
  "version": "1.0.0",
  • 作用:定义项目的版本号。
  • 符号和语句
    • "version":键,表示项目版本。
    • "1.0.0":值,表示项目的版本号,遵循语义化版本规范(SemVer)。
  • 与其他文件的关联
    • 版本号用于发布到 npm 或管理项目的更新。

2.3 入口文件
  "main": "server.js",
  • 作用:定义项目的入口文件。
  • 符号和语句
    • "main":键,表示项目的入口文件。
    • "server.js":值,表示项目的入口文件是 server.js
  • 与其他文件的关联
    • 当其他模块通过 requireimport 引入该项目时,会加载 server.js 文件。

2.4 脚本
  "scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "node server.js"},
  • 作用:定义项目的脚本命令。
  • 符号和语句
    • "scripts":键,表示项目的脚本命令。
    • "test":键,表示测试脚本。
      • "echo \"Error: no test specified\" && exit 1":值,表示运行测试脚本时的命令。这里只是输出错误信息并退出。
    • "start":键,表示启动脚本。
      • "node server.js":值,表示运行 node server.js 启动项目。
  • 与其他文件的关联
    • 在命令行中运行 npm testnpm start 时,会执行对应的脚本。

2.5 关键字
  "keywords": [],
  • 作用:定义项目的关键字,用于 npm 搜索和分类。
  • 符号和语句
    • "keywords":键,表示项目关键字。
    • []:值,表示关键字列表。这里为空,通常可以添加描述项目的关键词。
  • 与其他文件的关联
    • 关键字在发布到 npm 时用于帮助用户搜索项目。

2.6 作者
  "author": "",
  • 作用:定义项目的作者信息。
  • 符号和语句
    • "author":键,表示项目作者。
    • "":值,表示作者信息。这里为空,通常可以填写作者姓名或联系方式。
  • 与其他文件的关联
    • 作者信息在发布到 npm 时显示。

2.7 许可证
  "license": "ISC",
  • 作用:定义项目的许可证。
  • 符号和语句
    • "license":键,表示项目许可证。
    • "ISC":值,表示项目使用 ISC 许可证。
  • 与其他文件的关联
    • 许可证信息在发布到 npm 时显示,并告知用户项目的使用权限。

2.8 依赖项
  "dependencies": {"a": "file:","express": "^4.21.2"},
  • 作用:定义项目的依赖项。
  • 符号和语句
    • "dependencies":键,表示项目依赖项。
    • "a": "file:":键值对,表示依赖项 a 是一个本地文件路径。这里配置有问题,通常需要指定具体的路径。
    • "express": "^4.21.2":键值对,表示依赖项 express,版本号为 ^4.21.2
      • ^4.21.2:表示允许安装 4.x.x 的最新版本,但不包括 5.x.x。
  • 与其他文件的关联
    • 在运行 npm install 时,会根据 dependencies 安装依赖项。
    • express 是项目的核心依赖,用于创建 Web 服务器。

2.9 项目描述
  "description": ""
  • 作用:定义项目的描述信息。
  • 符号和语句
    • "description":键,表示项目描述。
    • "":值,表示项目描述。这里为空,通常可以填写项目的简要说明。
  • 与其他文件的关联
    • 描述信息在发布到 npm 时显示。

3. 代码与其他文件的关联

3.1 与 server.js 的关联
  • "main": "server.js" 指定了项目的入口文件是 server.js
  • "start": "node server.js" 脚本命令会运行 server.js 文件。
3.2 与 node_modules 的关联
  • "dependencies" 中的依赖项会在运行 npm install 时安装到 node_modules 目录中。
3.3 与 package-lock.json 的关联
  • package-lock.json 文件会记录依赖项的确切版本,确保项目在不同环境中的一致性。

4. 总结

  • 功能package.json 文件定义了项目的元数据、依赖项、脚本等信息。
  • 与其他文件的关联
    • server.js 关联,指定入口文件和启动脚本。
    • node_modules 关联,管理项目依赖项。
    • package-lock.json 关联,确保依赖项的一致性。
const express = require('express');
const mediaTypeValidator = require('./src/middleware/mediaTypeValidator');
const app = express();app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(mediaTypeValidator);const apiRouter = require('./src/routes/index');
app.use('/api', apiRouter);app.get('/', (req, res) => {res.send('Hello, IFN666!');
});const port = 3000;
app.listen(port, () => {console.log(`Server is listening on port ${port}`);
});module.exports = app;

以下是对 server.js 文件的 逐行详细讲解,包括每一行代码的关系、符号和语句的作用,以及与其他文件的关联。


1. 代码概述

server.js 是 Express 应用的入口文件,用于启动服务器并配置中间件和路由。它定义了服务器的行为,包括请求处理、路由映射和端口监听。


2. 代码逐行讲解

2.1 导入 Express 模块
const express = require('express');
  • 作用:导入 Express 模块。
  • 符号和语句
    • const express = require('express'):加载 Express 模块并将其赋值给 express 变量。
      • require('express'):Node.js 的模块导入语法,用于加载 Express 模块。
  • 与其他文件的关联
    • Express 是项目的核心依赖,用于创建 Web 服务器。

2.2 导入中间件
const mediaTypeValidator = require('./src/middleware/mediaTypeValidator');
  • 作用:导入自定义中间件 mediaTypeValidator
  • 符号和语句
    • const mediaTypeValidator = require('./src/middleware/mediaTypeValidator'):加载 mediaTypeValidator 中间件。
      • require('./src/middleware/mediaTypeValidator'):加载 mediaTypeValidator.js 文件,并获取其导出的中间件函数。
  • 与其他文件的关联
    • mediaTypeValidator 中间件用于验证请求的 Content-Type,确保其为 application/json

2.3 创建 Express 应用
const app = express();
  • 作用:创建一个 Express 应用实例。
  • 符号和语句
    • const app = express():调用 express() 函数,创建一个 Express 应用实例。
      • express():Express 模块的构造函数,用于创建应用实例。
  • 与其他文件的关联
    • app 是 Express 应用的核心对象,用于配置中间件、路由和启动服务器。

2.4 配置 JSON 和 URL 编码解析
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
  • 作用:配置 Express 应用以解析 JSON 和 URL 编码的请求体。
  • 符号和语句
    • app.use(express.json()):使用 express.json() 中间件,解析请求体中的 JSON 数据。
      • express.json():内置中间件,用于解析 JSON 格式的请求体。
    • app.use(express.urlencoded({ extended: true })):使用 express.urlencoded() 中间件,解析 URL 编码的请求体。
      • express.urlencoded({ extended: true }):内置中间件,用于解析 URL 编码的请求体。
        • extended: true:允许解析嵌套对象。
  • 与其他文件的关联
    • 这些中间件使 Express 能够自动解析客户端发送的 JSON 和表单数据。

2.5 使用自定义中间件
app.use(mediaTypeValidator);
  • 作用:使用自定义中间件 mediaTypeValidator
  • 符号和语句
    • app.use(mediaTypeValidator):将 mediaTypeValidator 中间件注册为全局中间件。
      • app.use:用于注册中间件。
      • mediaTypeValidator:自定义中间件,用于验证请求的 Content-Type
  • 与其他文件的关联
    • mediaTypeValidator 中间件在 ./src/middleware/mediaTypeValidator.js 中定义。

2.6 导入并注册 API 路由
const apiRouter = require('./src/routes/index');
app.use('/api', apiRouter);
  • 作用:导入并注册 API 路由。
  • 符号和语句
    • const apiRouter = require('./src/routes/index'):加载 index.js 文件,并获取其导出的路由器实例。
      • require('./src/routes/index'):加载 index.js 文件。
    • app.use('/api', apiRouter):将 /api 路径映射到 apiRouter
      • app.use:用于将路径与路由器或中间件绑定。
      • '/api':路径前缀,表示所有以 /api 开头的请求都会由 apiRouter 处理。
      • apiRouter:路由器实例,处理具体的 API 请求。
  • 与其他文件的关联
    • apiRouter./src/routes/index.js 中定义,进一步组织和管理子路由。

2.7 定义根路由
app.get('/', (req, res) => {res.send('Hello, IFN666!');
});
  • 作用:定义根路由,处理 GET / 请求。
  • 符号和语句
    • app.get('/', (req, res) => { ... }):定义处理 GET / 请求的路由。
      • app.get:用于定义处理 GET 请求的路由。
      • '/':路由路径,表示根路径。
      • (req, res) => { ... }:路由处理函数,接收请求对象 req 和响应对象 res
    • res.send('Hello, IFN666!'):向客户端发送响应内容。
      • res.send:用于发送 HTTP 响应。
  • 与其他文件的关联
    • 这是一个简单的示例路由,用于测试服务器是否正常运行。

2.8 启动服务器
const port = 3000;
app.listen(port, () => {console.log(`Server is listening on port ${port}`);
});
  • 作用:启动服务器并监听指定端口。
  • 符号和语句
    • const port = 3000:定义服务器监听的端口号。
    • app.listen(port, () => { ... }):启动服务器并监听指定端口。
      • app.listen:用于启动服务器。
      • port:服务器监听的端口号。
      • () => { ... }:回调函数,在服务器启动后执行。
    • console.log(Server is listening on port ${port}):在控制台输出服务器启动信息。
  • 与其他文件的关联
    • 服务器启动后,可以通过 http://localhost:3000 访问。

2.9 导出 Express 应用
module.exports = app;
  • 作用:导出 Express 应用实例。
  • 符号和语句
    • module.exports = app:将 app 对象导出。
      • module.exports:Node.js 的模块导出语法,用于将对象、函数或变量导出。
  • 与其他文件的关联
    • 导出 app 对象后,可以在测试或其他模块中使用。

3. 代码与其他文件的关联

3.1 与 src/middleware/mediaTypeValidator.js 的关联
  • mediaTypeValidator 中间件在 server.js 中注册为全局中间件,用于验证请求的 Content-Type
3.2 与 src/routes/index.js 的关联
  • apiRouterserver.js 中注册为 /api 路由,进一步组织和管理子路由。
3.3 与 src/controllers/driver.js 的关联
  • apiRouter 中的子路由会调用 driver.js 中的控制器方法,处理具体的业务逻辑。

4. 总结

  • 功能server.js 是 Express 应用的入口文件,用于配置中间件、路由和启动服务器。
  • 与其他文件的关联
    • src/middleware/mediaTypeValidator.js 关联,注册自定义中间件。
    • src/routes/index.js 关联,注册 API 路由。
    • src/controllers/driver.js 关联,处理具体的业务逻辑。

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

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

相关文章

【蓝桥杯速成】| 9.回溯升级

题目一:组合综合 问题描述 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返…

apache-maven-3.9.9 详细安装配置教程(2025版)

apache-maven-3.9.9 详细安装配置教程 一、下载解压二、配置本地仓库镜像源三、配置环境变量四、配置 IDEA 一、下载解压 官网地址: https://maven.apache.org/download.cgi二、配置本地仓库镜像源 解压并新建文件夹,作为 maven 下载仓库。目的&#…

构建企业级数据的愿景、目标与规划历程

文章目录 1. 企业级数据的愿景2. 企业级数据的目标、实施标准和战略3. 企业级数据的蓝图3.1 业务数字化转型的蓝图3.2 大数据平台的架构蓝图 4. 企业级数据的规划历程4.1 第一阶段:数据生产与打通4.2 第二阶段:数据集成、联接、应用 伴随着数字科技、通信…

深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨

🕹️ 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 在 JavaScript/TypeScript 开发中,if (!value) 是最常见的条件判断之一。它看似简单,却隐藏着语言的核心设计逻辑,也是许多开发者…

74HC04(反相器)和74HC14(反相器、施密特触发器)的区别

74HC04和74HC14的具体区别详解 同样具有反相器功能,你知道74HC04和74HC14的具体区别吗? 74HC04 对于74HC04很好理解,输入低电平,输出高电平;输入高电平,输出低电平。 建议操作条件: 下图是TI的…

面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)

面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求: 人工分拣效率低、出错率高(如药品批次混淆、过期风险)温控药品(如疫苗、生物制…

AI大白话(三):深度学习——AI的‘大脑‘是如何构建的?

🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? 大家好!继前两篇介绍AI基础和机器学习的文章后,今天我们来聊聊深度学习——这个让AI技术近年来突飞猛进的"神奇引擎"。别担心,我会用…

19681 01背包

19681 01背包 ⭐️难度:中等 🌟考点:动态规划、01背包 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…

DeepSeek R1 本地部署指南 (2) - macOS 本地部署

上一篇: DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…

威联通 加载swoole记录

命令不是php -v是php7.4 php7.4 安装位置 查看ini路径 php-fpm7.4文件位置 /share/CACHEDEV2_DATA/.qpkg/PHP7.4/bin/ 创建软链接 可以在 /etc/init.d/ 目录下创建一个指向 /share/CACHEDEV2_DATA/.qpkg/PHP7.4/bin/php - fpm7.4 的软链接,这样系统就能识别…

启动方法jupyter(Anaconda)

原本我一直以为需要启动anaconda才能去开启jupyter,但是看到同学的windows可以直接通过菜单去开启并使用jupyter,所以我意识到开启jupyter不需要那么复杂。那么Linux中有没有更方便的方法去启动呢? 首先我们要知道anaconda仅仅是一个集成的环…

ManiWAV:通过野外的音频-视频数据学习机器人操作

24年6月来自斯坦福大学、哥伦比亚大学和 TRI 的论文“ManiWAV: Learning Robot Manipulation from In-the-Wild Audio-Visual Data”。 音频信号通过接触为机器人交互和物体属性提供丰富的信息。这些信息可以简化接触丰富的机器人操作技能学习,尤其是当视觉信息本身…

阿里云国际站代理商:如何构建交互式安全分析看板?

1.明确看板目的 在构建交互式安全分析看板之前,首先要明确看板的具体目的和目标用户。例如,是为了实时监控网络安全态势,还是为了分析历史安全事件。明确目的有助于确定看板上需要展示的关键指标和数据类型。 2.选择合适的数据可视化…

Linux固定IP方法(RedHat+Net模式)

1、查看当前网关 ip route | grep default 2、配置静态IP 双击重启 3、验证

Android音视频多媒体开源库基础大全

从事音视频开发工作,需要了解哪些常见的开源库,从应用到底软系统,整理了九大类,这里一次帮你总结完。 包含了应用层的MediaRecorder、surfaceView,以及常见音视频处理库FFmpeg和OpenCV,还有视频渲染和音频…

代码随想录算法训练营第十五天 | 数组 |长度最小的子数组和螺旋矩阵II

长度最小的子数组 【题目简介】 【自写数组解法】 class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minLength float(inf)slow 0fast 0cur_sum nums[slow]# 终止条件&#xff1a;fast不能超过最大索引值while slow < fast and fas…

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…

Compose 实践与探索十六 —— 与传统的 View 系统混用

Compose 发展初期的几年&#xff0c;会是新的模块用 Compose 写&#xff0c;然后逐渐的把老界面从 View 替换成 Compose 组件&#xff0c;直到全部或几乎全部是 Compose 代码的模式。 原生的 SurfaceView 与 TextureView 的重点是在它们底层的 Surface API&#xff0c;而不是 V…

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

xLua_001 Lua 文件加载

xLua下载 1、HelloWrold 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; // 引入XLua命名空间 public class Helloworld01 : MonoBehaviour {//声明LuaEnv对象 private LuaEnv luaenv;void Start(){//实例化LuaEnv对象…