【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_name
、last_name
和 licence_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.js
和src/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;
- 解释:
- 如果请求方法是
POST
或PUT
,检查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.getAll
、controller.get
、controller.create
、controller.update
和controller.delete
。
- 定义了路由
server.js
:- 启动 Express 服务器,并将
/api
路由指向src/routes/index.js
。
- 启动 Express 服务器,并将
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
。如果请求方法是 POST
、PUT
或 PATCH
,并且 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 方法(如GET
、POST
等)。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
是否为null
或undefined
。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 数据的
POST
、PUT
和PATCH
请求。 - 与其他文件的关联:
- 在
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 方法(GET
、POST
、PUT
、DELETE
)映射到相应的控制器方法。
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
对象包含了getAll
、get
、create
、update
和delete
方法,这些方法在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.js
或routes/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
。
- 与其他文件的关联:
- 当其他模块通过
require
或import
引入该项目时,会加载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 test
或npm 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
的关联
apiRouter
在server.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
关联,处理具体的业务逻辑。
- 与
相关文章:
【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…...
visual studion 2022如何使用PlaySound()
书籍:《windows程序设计(第五版)》的开始 环境:visual studio 2022 内容:HELLOWIN程序 说明:以下内容大部分来自腾讯元宝。 在Visual Studio 2022中使用PlaySound()函数播放音频,需完成以下步骤: 1. 配…...
C++相关基础概念之入门讲解(下)
1. 引用 int main() {const int a10;int& aaa;aa;cout<<aa<<endl; } 引用 不是新定义一个变量,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空 间,它和它引用的变量 共用同一块内存空间(初…...
从零开始学可靠消息投递:分布式事务的“最终一致性”方案
一、什么是可靠消息投递?—— 消息队列的“防丢宝典” 可靠消息投递 是指通过消息队列(如 RocketMQ)确保消息在生产、传输、消费过程中不丢失、不重复、有序到达。其核心目标是在分布式系统中保障数据最终一致性,常用于订单处理、…...
生物化学笔记:医学免疫学原理 免疫系统的组成与功能+克隆选择学说
免疫系统的组成与功能 克隆选择学说 克隆选择学说(Clonal Selection Theory)是免疫学的核心理论之一,由 麦克法兰伯内特(Frank Macfarlane Burnet) 在 1957 年提出,用于解释特异性免疫反应的机制。 基本概…...
SpringBoot最佳实践之 - 使用AOP记录操作日志
1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求,开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友,可以参考此篇博客中记录日志的方式,可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…...
MySql中 一条select语句的执行流程
一条 SELECT 语句的执行流程涉及到数据库管理系统(DBMS)的多个组件和阶段。以下是一个更为详细的执行流程,以关系型数据库(如 MySQL、PostgreSQL 等)为例: 1. 客户端发送查询 用户输入:用户在客…...
图论——kruskal算法
53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…...
【dify】 dify环境变量配置说明
这是一份Dify平台的环境变量配置文件,对平台的各项功能、服务和组件进行参数设置。以下是对其主要部分的详细解读: 1. 通用变量(Common Variables) CONSOLE_API_URL:控制台API的后端URL,用于拼接授权回调…...
如何在 Vue 项目中实现动态组件加载,有什么应用场景?
大白话如何在 Vue 项目中实现动态组件加载,有什么应用场景? 什么是动态组件加载 在 Vue 项目里,动态组件加载就是能够在程序运行时动态地决定要渲染哪个组件。打个比方,就像你去餐馆点菜,不同的时间你可能想吃不同的…...
FRP在物联网设备中的穿透方案
物联网设备常位于NAT后,FRP为其提供稳定穿透链路。 配置要点 轻量化部署:使用ARM版本FRP客户端,适配树莓派等设备9。 自启动脚本:通过systemd或crontab实现设备重启后自动连接26。 低功耗优化:调整心跳间隔…...
Android 13深度定制:SystemUI状态栏时间居中显示终极实战指南
一、架构设计与技术解析 1. SystemUI状态栏核心布局机制 层级结构 mermaid 复制 graph TDPhoneStatusBarView --> StatusBarContents[status_bar_contents]StatusBarContents --> LeftLayout[status_bar_left_side]StatusBarContents --> ClockLayout[Clock控件]Left…...
Python实战(3)-数据库操作
前面说过,可用的SQL数据库引擎有很多,它们都有相应的Python模块。这些数据库引擎大都作为服务器程序运行,连安装都需要有管理员权限。为降低Python DB API的使用门槛,我选择了一个名为SQLite的小型数据库引擎。它不需要作为独立的…...
【redis】在 Spring中操作 Redis
文章目录 基础设置依赖StringRedisTemplate库的封装 运行StringList删库 SetHashZset 基础设置 依赖 需要选择这个依赖 StringRedisTemplate // 后续 redis 测试的各种方法,都通过这个 Controller 提供的 http 接口来触发 RestController public class MyC…...
企业数据孤岛的纠结与恩怨
以下是关于控制中数据孤岛的纠结于恩怨: 一、工业控制中数据孤岛的定义 工业控制中的数据孤岛是指在工业生产过程中,各个生产环节、不同的系统或设备之间的数据相互独立、隔离,无法进行有效的共享和交互,形成了一个个相对封闭的数…...
在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18
作者:来自 Elastic Peter Straer 及 Benjamin Trent 本文探讨了如何优化后期交互向量,以适应大规模生产工作负载,例如减少磁盘空间占用和提高计算效率。 在之前关于 ColPali 的博客中,我们探讨了如何使用 Elasticsearch 创建视觉搜…...
开发SAPUI5 Fiori应用并部署到SAP系统
首先新建一个项目文件夹 在VScode中打开 打开SAP Fiori(需要先下载安装,参考上上一篇文章) ,选择已添加的SAP S4 ERP系统 ,点击创建Firoi应用。 如果没有添加系统的,点击添加按钮,添加即可,注意ÿ…...
<C#> 详细介绍.net 三种依赖注入:AddTransient、AddScoped、AddSingleton 的区别
在 .NET 8 里,AddTransient、AddScoped 和 AddSingleton 均为依赖注入容器用于注册服务的方法,不过它们的生命周期管理方式存在差异。下面为你详细介绍这三种方法的区别。 1. AddTransient AddTransient 方法所注册的服务,每次被请求时都会…...
游戏引擎学习第168天
回顾并计划今天的内容 今天我们将进行一些思考工作,回顾一下之前的工作。我们已经在资产处理工具中提取了字体,并展示了如何使用该库。我们有两个版本,一个不使用任何库,适合想要完全不依赖库的用户; 我们今天的任务…...
html5炫酷3D立体文字效果实现详解
炫酷3D立体文字效果实现详解 这里写目录标题 炫酷3D立体文字效果实现详解项目概述技术实现要点1. 基础布局设置2. 动态背景效果3. 文字渐变效果4. 立体阴影效果5. 悬浮动画效果 技术难点及解决方案1. 文字渐变动画2. 立体阴影效果3. 性能优化 浏览器兼容性总结 项目概述 在这个…...
VSCode中搜索插件显示“提取扩展时出错。Failed to fetch”问题解决!
大致的问题如下,在VSCode的插件商店搜索插件时提示如下: 导致的情况有以下几点: 1、代理问题,如果是代理引起的,可以继续使用代理后也能搜索和安装插件。 2、还有可能是你的所连接的网络设置了防火墙,比较…...
回溯-单词搜索
79.单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平…...
高级java每日一道面试题-2025年3月07日-微服务篇[Eureka篇]-Eureka Server和Eureka Client关系?
如果有遗漏,评论区告诉我进行补充 面试官: Eureka Server和Eureka Client关系? 我回答: 在微服务架构中,Eureka作为Netflix开源的服务发现组件,由Eureka Server(服务端)和Eureka Client(客户端)两大部分…...
SpringBoot有几种获取Request对象的方法
HttpServletRequest 简称 Request,它是一个 Servlet API 提供的对象,用于获取客户端发起的 HTTP 请求信息。例如:获取请求参数、获取请求头、获取 Session 会话信息、获取请求的 IP 地址等信息。 那么问题来了,在 Spring Boot 中…...
【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR
总结:建议大家选择稳定版本的分支,直接拉取 master 分支,可能出现一下后面更新代码导致缺失一些环境内容。 我是通过 Docker 进行安装的,由于项目开发者不严谨导致,遇到一个奇怪的问题: INTERNAL SERVER E…...
操作系统——(处理机调度与死锁)
目录 一、处理机调度 (1)层次 (2)进程调度 (3)调度算法 1.先来先服务算法(FCFS) 2.短作业优先算法(SJF) 3.高优先权算法(HPF) …...
MyBatis 面试专题
MyBatis 面试专题 基础概念MyBatis中的工作原理MyBatis 与 Hibernate 的区别?#{} 和 ${} 的区别?MyBatis 的核心组件有哪些? 映射与配置如何传递多个参数?ResultMap 的作用是什么?动态 SQL 常用标签有哪些?…...
C++实现大整数相加
力扣原题字符串相加 415. 字符串相加 - 力扣(LeetCode) 大整数意味着无法用基本数据类型装下,只能用字符串装下,然后手工模拟计算过程 从两个字符串的最后一位开始两两相加,记录进位,每次均有sumabsum&…...
Flutter 快速接入Fair
少点废话 1.了解Fair Fair,由58同城开源提供,目的是flutter项目上架后动态更新代码, 首先了解一个概念,热更新是flutter打包APK后会讲所有的dart代码生成一个so文件,手机通过读取并执行so文件;基于此&am…...
【深度学习新浪潮】AI ISP技术与手机厂商演进历史
本文是关于AI ISP(人工智能图像信号处理器)的技术解析、与传统ISP(图像信号处理器)的区别、近三年研究进展,以及各大手机厂商在该领域演进历史的详细报告。本报告综合多个权威来源的信息,力求全面、深入地呈现相关技术发展脉络与行业动态。 第一部分:AI ISP的定义及与传…...
用逻辑分析仪分析Usart波形
USART的波形抓取最简单,帧头帧尾只需要电平上升下降沿就可以了,不需要自己定义,也没有ID位,逻辑分析仪可以直接抓取发送的数据: 口配置:9600bps,8数据位,无校验,1个停止位…...
常⻅CMS漏洞 -DeDeCMS 获取webshell
DedeCMS是织梦团队开发PHP ⽹站管理系统,它以简单、易⽤、⾼效为特⾊,组建出各种各样各 具特⾊的⽹站 姿势⼀:通过⽂件管理器上传WebShell 1.访问⽬标靶场dedecms 后台可以直接上传任意⽂件 2.上传木马文件 3.蚁剑连接 姿势⼆:…...
基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)
摘 要 随着我国经济的飞速发展,促使各种能源使用入不敷出,尤其是最主要的能源,煤炭石油资源不断消耗与短缺,因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点,且分布范围广&…...
JAVA_数据结构_栈和队列
1.栈(Stack) 1.1概念 栈是一种特殊的线性表,它只允许一端进行增删查改操作,它的头称为栈顶,进行压栈和出栈的操作,则另一端称为栈底,并且它遵循着先进后出的操作。 压栈:也可称为进…...
独立组网和非独立组网
独立组网(SA) vs. 非独立组网(NSA) 5G组网方式主要分为 独立组网(SA, Standalone) 和 非独立组网(NSA, Non-Standalone),两者在网络架构、核心网、应用场景等方面有所不…...
HR人员和组织信息同步AD域服务器实战方法JAVA
HR人员和组织信息同步AD域服务器 前期准备AD域基础知识整理HR同步AD的逻辑代码结构配置文件设置启动类HR组织的BeanHR人员Bean获取HR人员和组织信息的类AD中处理组织和人员的类日志配置 POM.xml文件生成EXE文件服务器定时任务异常问题注意事项 前期准备 1、开发语言࿱…...
【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
【测试开发】OKR 网页管理端自动化测试报告
【测试报告】OKR 管理端 项目名称版本号测试负责人测试完成日期联系方式OKR 管理端4.0马铭胜2025-03-2115362558972 1、项目背景 1.1 OKR 用户端 在如今这个快节奏的时代中,个人和组织的成长往往依赖于清晰、明确且意义深远的目标。然而,如何设定并持…...
go语言中空结构体
空结构体(struct{}) 普通理解 在结构体中,可以包裹一系列与对象相关的属性,但若该对象没有属性呢?那它就是一个空结构体。 空结构体,和正常的结构体一样,可以接收方法函数。 type Lamp struct{}func (l Lamp) On()…...
如何缓解大语言模型推理中的“幻觉”(Hallucination)?
目录 如何缓解大语言模型推理中的“幻觉”(Hallucination)? 1. 什么是大语言模型的“幻觉”(Hallucination)? 幻觉的常见类型 2. 如何缓解大模型的幻觉问题? 方法 1:使用知识检索…...
优选算法系列(3.二分查找 )
目录 一.二分查找(easy) 题目链接:704. 二分查找 - 力扣(LeetCode) 解法: 代码: 二.在排序数组中查找元素的第⼀个和最后⼀个位置(medium) 题目链接:34.…...
【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
论文地址:Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来,多行为推荐模型取得了显著成功。然而,许多模型未充分考虑不同行为之间的共性与差异性,以…...
细胞计数专题 | 高效 + 精准!点成LUNA-III™细胞计数仪解锁活细胞检测与浓度分析新高度
1 引言 在生物医学研究中,准确的细胞计数至关重要,它影响着细胞治疗、疾病诊断、组织再生和生物测定等应用领域。传统的手动计数方法既耗时又容易产生偏差。像点成LUNA-III™自动细胞计数仪这样的自动化系统,为提高计数的准确性、可重复性和…...
糊涂人寄信——递推
思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。 当有三…...
深入Python C API:掌握常用函数与实战技巧
深入Python C API:掌握常用函数与实战技巧 Python的灵活性和易用性使其成为广泛应用的编程语言,但在某些场景下(如高性能计算、与C/C代码交互),直接使用C语言扩展Python的能力变得尤为重要。Python C API(…...
第16章:基于CNN和Transformer对心脏左心室的实验分析及改进策略
目录 1. 项目需求 2. 网络选择 2.1 UNet模块 2.2 TransUnet 2.2.1 SE模块 2.2.2 CBAM 2.3 关键代码 3 对比试验 3.1 unet 3.2 transformerSE 3.3 transformerCBAM 4. 结果分析 5. 推理 6. 下载 1. 项目需求 本文需要做的工作是基于CNN和Transformer的心脏左心室…...
Word中公式自动标号带章节编号
(1)插入一行三列的表格,设置宽度分别为0.5,13.39和1.5,设置纵向居中,中间列居中对齐,最右侧列靠右对齐,设置段落如下 (2)插入域代码 【Word】利用域代码快速实…...
AI风向标《AI与视频制作全攻略:从入门到精通实战课程》
课程信息 AI风向标《AI与视频制作全攻略:从入门到精通实战课程》,夸克网盘和百度网盘课程。 课程介绍 《AI与视频制作全攻略:从入门到精通实战课程》是一套全面融合AI技术与视频制作的实战课程,旨在帮助创作者从基础软件使用到高级视频剪辑…...
el-table折叠懒加载支持排序
el-table折叠懒加载支持排序 因为el-table懒加载的子节点是通过缓存实现的,如果想在展开的情况下直接刷新对应子节点数据,要操作el-table组件自身数据,否则不会更新 以排序功能为例 maps: new Map() //用于存储子节点懒加载的数据// 加载子…...
Kotlin v2.1.20 发布,标准库又有哪些变化?
大家吼哇!就在三小时前,Kotlin v2.1.20 发布了,更新的内容也已经在官网上更新:What’s new in Kotlin 2.1.20 。 我粗略地看了一下,下面为大家选出一些我比较感兴趣、且你可能也会感兴趣的内容。 注意!这里…...