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

【Nodejs】Express基本使用

在这里插入图片描述

Express 中文网

基于 Node.js 平台,快速、开放、极简的 web 开发框架。

1.Express的安装方式


Express的安装可直接使用npm包管理器上的项目,在安装npm之前可先安装淘宝镜像:
npm install -g cnpm --registry=https://registry.npmmirror.com/

这样我们使用cnpm的来代替npm,这使得下载速度提高很多;其次你需要在你项目目录下运行以下指令来初始化npm,期间所有提示按enter键即可,这会生成package.json,它是用于描述项目文件的。

cnpm init

再输入

cnpm install

这下项目目录中又会多出一个叫node_modules文件夹,里面是node.js为我们提供的模块,当然现在没有。接下来便是真正的安装express了,执行:

cnpm install express --save

这时,我们看到node_modules文件夹多了许多不同版本的应用文件夹,接下来执行

express --version

查看express是否安装成功,如果显示版本号,则安装正确。

4.16.1

2.运行原理


底层:http模块

Express框架建立在node.js内置的http模块上。http模块生成服务器的原始代码如下

var http = require("http");var app = http.createServer(function(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.end("Hello world!");
});app.listen(3000, "localhost");

Express框架的核心是对http模块的再包装。上面的代码用Express改写如下

var express = require('express');
var app = express();app.get('/', function (req, res) {res.send('Hello world!');
});app.listen(3000);

Express框架等于在http模块之上,加了一个中间层

什么是中间件

  • 简单说,中间件(middleware)就是处理HTTP请求的函数。它最大的特点就是,一个中间件处理完,再传递给下一个中间件。App实例在运行过程中,会调用一系列的中间件
    每个中间件可以从App实例,接收三个参数,依次为request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。
  • 一个不进行任何操作、只传递request对象的中间件,就是下面这样
function uselessMiddleware(req, res, next) {next();
}
  • 上面代码的next就是下一个中间件。如果它带有参数,则代表抛出一个错误,参数为错误文本
  • 抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止
function uselessMiddleware(req, res, next) {next('出错了!');
}

3.Express 方法


Express路由简介

路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式。它包含一个请求方时(methods)、路径(path)和路由匹配时的函数(callback);

app.methods(path, callback);

Express路由方法

Express方法源于 HTTP 方法之一,附加到 express 类的实例。它可请求的方法包括:
get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purge、propfind、proppatch、unlock、report、mkactivity、checkout、merge、m-search、notify、subscribe、unsubscribe、patch、search 和 connect

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback…], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。

下面是一个基本的路由示例:

var express = require('express');
var app = express();// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {//写完一个send,后面所有跟路由有关的都不会执行//会自动响应对应的数据类型//   res.send([1, 2, 3]);//   res.send({ ok: 1 });//   res.json({ ok: 1 });// 使用混合使用函数数组处理时如果前面有res.send();那么后面和路由处理相关代码都不生效res.send('hello world');res.send(`<html><h1>hello world</h2></html>`);
});

路由路径和请求方法一起定义了请求的端点,它可以是字符串、字符串模式或者正则表达式。

all方法和HTTP动词方法

针对不同的请求,Express提供了use方法的一些别名。比如,上面代码也可以用别名的形式来写

var express = require("express");
var http = require("http");
var app = express();app.all("*", function(request, response, next) {response.writeHead(200, { "Content-Type": "text/plain" });next();
});app.get("/", function(request, response) {response.end("Welcome to the homepage!");
});app.get("/about", function(request, response) {response.end("Welcome to the about page!");
});app.get("*", function(request, response) {response.end("404!");
});http.createServer(app).listen(1337);
  • 上面代码的all方法表示,所有请求都必须通过该中间件,参数中的“*”表示对所有路径有效。get方法则是只有GET动词的HTTP请求通过该中间件,它的第一个参数是请求的路径。由于get方法的回调函数没有调用next方法,所以只要有一个中间件被调用了,后面的中间件就不会再被调用了
  • 除了get方法以外,Express还提供post、put、delete方法,即HTTP动词都是Express的方法
  • 除了get方法以外,Express还提供post、put、delete方法,即HTTP动词都是Express的方法
  • 这些方法的第一个参数,都是请求的路径。除了绝对匹配以外,Express允许模式匹配
app.get("/hello/:who", function(req, res) {res.end("Hello, " + req.params.who + ".");
});

4.路径匹配


4.1 字符串路径

// 匹配根路径的请求
app.get('/', function (req, res) {res.send('root');
});// 匹配 /about 路径的请求
app.get('/about', function (req, res) {res.send('about');
});// 匹配 /random.text 路径的请求
app.get('/random.text', function (req, res) {res.send('random.text');
});

4.2 字符串模式路径

使用字符串模式的路由路径示例:

// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {res.send('ab?cd');
});// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {res.send('ab+cd');
});// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {res.send('ab*cd');
});// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {res.send('ab(cd)?e');
});

4.3 正则表达式路径

使用正则表达式的路由路径示例:

// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {res.send('/a/');
});// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {res.send('/.*fly$/');
});

可以为请求处理提供多个回调函数,其行为类似 中间件。唯一的区别是这些回调函数有可能调用 next(‘route’) 方法而略过其他路由回调函数。可以利用该机制为路由定义前提条件,如果在现有路径上继续执行没有意义,则可将控制权交给剩下的路径。

app.get('/example/a', function (req, res) {res.send('Hello from A!');
});

使用多个回调函数处理路由(记得指定 next 对象):

app.get('/example/b', function (req, res, next) {console.log('response will be sent by the next function ...');next();
}, function (req, res) {res.send('Hello from B!');
});

使用回调函数数组处理路由:

var cb0 = function (req, res, next) {console.log('CB0')next()
}var cb1 = function (req, res, next) {console.log('CB1')next()
}var cb2 = function (req, res) {res.send('Hello from C!')
}app.get('/example/c', [cb0, cb1, cb2])

5.response对象


方法描述
res.download()提示要下载的文件。
res.end()结束响应过程。
res.json()发送JSON响应。
res.jsonp()发送带有JSONP支持的JSON响应。
res.redirect()重定向请求。
res.render()渲染视图模板。
res.send()发送各种类型的响应。
res.sendFile()将文件作为八位字节流发送。
res.sendStatus()设置响应状态代码,并将其字符串表示形式发送为响应正文。

例:
(1)response.redirect方法

response.redirect方法允许网址的重定向

response.redirect("/hello/anime");
response.redirect("http://www.example.com");
response.redirect(301, "http://www.example.com"); 

(2)response.sendFile方法

response.sendFile方法用于发送文件

response.sendFile("/path/to/anime.mp4");

(3)response.render方法

response.render方法用于渲染网页模板。

//  使用render方法,将message变量传入index模板,渲染成HTML网页
app.get("/", function(request, response) {response.render("index", { message: "Hello World" });
});

6.路线处理程序


您可以提供行为类似于中间件的多个回调函数来处理请求。唯一的例外是这些回调可能会调用next(‘route’)以绕过其余的路由回调。您可以使用此机制在路由上施加先决条件,然后在没有理由继续使用当前路由的情况下将控制权传递给后续路由。

多个回调函数可以处理一条路由(确保指定了next对象)。例如:

app.get('/example/b', function (req, res, next) {console.log('the response will be sent by the next function ...')next()
}, function (req, res) {res.send('Hello from B!')
})

混合使用函数和函数数组处理路由:

const fun1 = (req, res, next) => {// 验证用户token过期, cookie过期console.log('token验证');let isValid = true;if (isValid) {next();} else {//将第一个中间件的数据传输到第二个中间件res.name = "dselegent";res.send('error');}
};
const fun2 = (req, res) => {console.log(res.name)res.send('home');
};
app.get('/home', [fun1, fun2]);app.get('/list', fun1, (req, res) => {res.send('list');
});

7.中间件


Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。

中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

中间件的功能包括:

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终结请求-响应循环。
  • 调用堆栈中的下一个中间件。

如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。

Express 应用可使用如下几种中间件:

  • 应用级中间件
  • 路由级中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

使用可选则挂载路径,可在应用级别或路由级别装载中间件。另外,你还可以同时装在一系列中间件函数,从而在一个挂载点上创建一个子中间件栈。

7.1 应用级中间件

应用级中间件绑定到 app 对象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。例如:

var app = express()
const indexRouter = require('./route/indexRouter');
const LoginRouter = require('./route/LoginRouter');//应用级别(后面的路由都会执行此中间件)
app.use((req, res, next) => {// 验证用户token过期, cookie过期console.log('token验证');let isValid = true;if (isValid) {next();} else {res.send('error');}
});//应用级别(这里不写路径默认/)
//这些use方法是每次访问都是从上往下执行
//如果是/login/a,会先找到/login开头的这个应用级中间件
//然后再进入这个中间件找/a
app.use(indexRouter);
app.use('/login', LoginRouter);

7.2 路由级中间件

(1)app.route()
您可以使用来为路由路径创建可链接的路由处理程序app.route()。由于路径是在单个位置指定的,因此创建模块化路由非常有帮助,减少冗余和错别字也很有帮助。有关路由的更多信息,请参见:Router()文档。

这是使用定义的链式路由处理程序的示例app.route()。

app.route('/book').get(function (req, res) {res.send(' Get a random book')}).post(function (req, res) {res.send('Add a book')}).put(function (req, res) {res.send('Update the book')})

(2)快速路由器
路由级中间件和应用级中间件一样,只是它绑定的对象为express.Router()

使用express.Router该类创建模块化的,可安装的路由处理程序。一个Router实例是一个完整的中间件和路由系统; 因此,它通常被称为“迷你应用程序”。

以下示例将路由器创建为模块,在其中加载中间件功能,定义一些路由,并将路由器模块安装在主应用程序的路径上。

home.js在app目录中创建一个名为以下内容的路由器文件:var router = express.Router()

var app = express()
var router = express.Router()// 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件
router.use(function (req, res, next) {console.log('Time:', Date.now())next()
})// 一个中间件栈,显示任何指向 /user/:id 的 HTTP 请求的信息
router.use('/user/:id', function(req, res, next) {console.log('Request URL:', req.originalUrl)next()
}, function (req, res, next) {console.log('Request Type:', req.method)next()
})// 一个中间件栈,处理指向 /user/:id 的 GET 请求
router.get('/user/:id', function (req, res, next) {// 如果 user id 为 0, 跳到下一个路由if (req.params.id == 0) next('route')// 负责将控制权交给栈中下一个中间件else next() //
}, function (req, res, next) {// 渲染常规页面res.render('regular')
})// 处理 /user/:id, 渲染一个特殊页面
router.get('/user/:id', function (req, res, next) {console.log(req.params.id)res.render('special')
})module.exports=  router

然后,在应用程序中加载路由器模块:

var indexRouter = require('./home')
// ...
app.use('/home', index)

该应用程序现在将能够处理对/home和的请求/home/user/123456

(3)router.route方法
router实例对象的route方法,可以接受访问路径作为参数

var router = express.Router();router.route('/api').post(function(req, res) {// ...}).get(function(req, res) {Bear.find(function(err, bears) {if (err) res.send(err);res.json(bears);});});module.exports=  router

7.3 错误处理中间件

错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res, next)。

//上面的中间件都没有匹配就会走这里
app.use(function(err, req, res, next) {console.error(err.stack)//send的状态码默认是200res.status(500).send('error')
})

7.4 内置的中间件

express.static 是 Express 唯一内置的中间件。它基于 serve-static,负责在 Express 应用中提托管静态资源。每个应用可有多个静态目录。

app.use(express.static('public'))
app.use(express.static('uploads'))
app.use(express.static('files'))

7.5 第三方中间件

安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。

下面的例子安装并加载了一个解析 cookie 的中间件: cookie-parser

$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')// 加载用于解析 cookie 的中间件
app.use(cookieParser())

8.获取参数


8.1 req.query

req.query()可以用来获取接口请求中拼接在链接"?"后边的参数,主要用于get请求,post请求也适用。 req.query()被express原生支持,并且会自动将参数转换为对象形式返回。
请求:

http://localhost:5050/server?p=user&q=password

express接口:

let express = require('express')
let server = express()
server.get('/server',(req,resp)=>{console.log(req.query);resp.send('')
})
server.listen(5050,()=>{console.log('服务器已就绪')
})

请求后得到的结果:
在这里插入图片描述

8.2 req.params

req.params()有些特殊,它适用于在url链接上传递数据参数,需要后台接口用==:变量名==的写法发起请求。

请求:

http://localhost:5050/nums/1000

express接口:

let express = require('express')
let server = express();
server.get('/nums/:num', (req, resp) => {console.log(req.params);resp.send('')
})
server.listen(5050, () =>{console.log('服务器已就绪')
})

请求后得到的结果:
在这里插入图片描述

8.3 req.body

req.body()被原生express所支持,可以直接使用req.body()获取post请求的表单数据。

请求:

fecth('http://localhost:5050/people',{method: 'post',headers: {'Content-Type': 'application/json'},body:{name: 'zhangsan', age: 15}
})

express接口:

const express = require('express');
const server = express();
//配置解析post参数的-不用下载第三方 ,内置
//解析post参数-(url-ky格式) username=kerwin&password=1234
// app.use(express.urlencoded({ extended: false }));
//解析post参数-(json字符串) {name:"",age:100}
app.use(express.json());
server.post('/people', (req, resp) => {console.log(req.body);resp.send('')
})
server.listen(5050, () => console.log('服务器已就绪'))

在这里插入图片描述

9.利用 Express 托管静态文件


通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。

将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JavaScript 文件,你就可以:

//直接将public里的index.html当成/的网页
app.use(express.static('public'))

现在,public 目录下面的文件就可以访问了。

http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html

所有文件的路径都是相对于存放目录的,因此,存放静态文件的目录名不会出现在 URL 中。

如果你的静态资源存放在多个目录下面,你可以多次调用 express.static 中间件:

app.use(express.static('public'))
app.use(express.static('files'))

访问静态资源文件时,express.static 中间件会根据目录添加的顺序查找所需的文件。

如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:

app.use('/static', express.static('public'))

现在,你就可以通过带有 “/static” 前缀的地址来访问 public 目录下面的文件了。

http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/images/bg.png
http://localhost:3000/static/hello.html

总结

app.use(express.static('public'))
<link rel="stylesheet" href="/css/index.css" />app.use('/static', express.static('public'))
<link rel="stylesheet" href="/static/css/index.css" />

相关文章:

【Nodejs】Express基本使用

Express 中文网 基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目&#xff0c;在安装npm之前可先安装淘宝镜像&#xff1a; npm install -g cnpm --registryhttps://registry.npmmirror.com/…...

k8s集群安装v1.20.9

参考网上资料并将异常问题解决&#xff0c;经测试可正常安装集群。 1.我的环境准备 本人使用vmware pro 17新建三个centos7虚拟机&#xff0c;每个2cpu&#xff0c;20GB磁盘存储&#xff0c;内存2GB&#xff0c;其中主节点的内存3GB&#xff0c;可使用外网. 2.所有节点安装D…...

Staples Drop Ship EDI 需求分析

Staples 是一家美国零售公司&#xff0c;总部位于马萨诸塞州弗拉明汉&#xff0c;主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年&#xff0c;该公司已跻身《财富》世界 500 强&#xff0c;后来又收购了办公用品公司 Qu…...

模型调参及优化

调参 调权重参数&#xff0c;偏置参数 训练数据集用来训练参数w&#xff0c;b 调超参数 验证数据集用来选择超参数学习率lr&#xff0c;隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合&#xff1b;当训练误差降下去&#xff0c;但泛化误差出现上升形式&…...

多数据源数据转换和同步的ETL工具推荐

有许多支持多数据源数据转换和同步的ETL工具可供选择。以下是一些常见的ETL工具和它们支持多数据源数据转换和同步的特点&#xff1a; Apache NiFi&#xff1a;Apache NiFi是一个开源的ETL工具&#xff0c;支持多种数据源的连接&#xff0c;包括文件系统、数据库、消息队列、网…...

配置 gitlab https 访问

文章目录 1. 备份2. 生成SSL证书3. 配置文件4. 重启5. 访问 1. 备份 docker exec -ti gitlab-ce gitlab-rake gitlab:backup:create2. 生成SSL证书 yum install openssl openssl-devel -y mkdir /data/gitlab/config/ssl ; cd /data/gitlab/config/ssl### 生成证书 openssl…...

Kepware Modbus驱动简介

1. Modbus驱动能够解决什么问题&#xff1f; 它是Modbus设备驱动的集合&#xff0c;为用户提供一种方便快捷的Modbus设备数采解决方案。 只需要通过简单的配置就可以将常见的例如Modbus TCP/IP Ethernet、RTU Serial 和 ASCII Serial等协议设备无缝连接到 HMI/SCADA、MES/His…...

从零开始学习CTF——CTF是什么

引言&#xff1a; 从2019年10月开始接触CTF&#xff0c;学习了sql注入、文件包含等web知识点&#xff0c;但都是只知道知识点却实用不上&#xff0c;后来在刷CTF题才发现知识点的使用方法&#xff0c;知道在哪里使用&#xff0c;哪里容易出漏洞&#xff0c;可是在挖src漏洞中还…...

为Android构建现代应用——主体结构

创建Screents和ViewModels 在前面的章节中&#xff0c;我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。 在本章中&#xff0c;我们将开始实现初始结构和模板&#xff0c;这将联接每一个应用程序的部分。 首先将添加以下带有各自视图模型的主屏幕&#xff1a; •…...

【shell脚本】shell脚本之日志切割(进阶实战三)

恭喜你&#xff0c;找到宝藏博主了&#xff0c;这里会分享shell的学习整过程。 shell 对于运维来说是必备技能之一&#xff0c;它可以提高很多运维重复工作&#xff0c;提高效率。 shell的专栏&#xff0c;我会详细地讲解shell的基础和使用&#xff0c;以及一些比较常用的she…...

VMLogin和虚拟机里的浏览器有什么区别?

虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。 指纹浏览器&#xff0c;也称防关联浏览器。 简单来说&#xff0c;就是允许在同一台电设备上操作和管理多个平台、多个账号&#xff0c;账…...

unimrcp server的session资源分配与回收

unimrcp使用APR的内存池管理内存&#xff0c;因此&#xff0c;处理函数中一般都会传递一个pool指针&#xff0c;需要内存时&#xff0c;就从pool里分配一块&#xff0c;一般也不需要关心内存的释放。因为&#xff0c;一路呼叫关联一个session&#xff0c;一个session对应一个po…...

【图论】三种中心性 —— 特征向量、katz 和 PageRank

维基百科&#xff1a;在图论和网络分析中&#xff0c;中心性指标为图中相应网络位置的节点分配排名或数值。中心性这一概念最初起源于社交网络分析&#xff0c;因此很多衡量中心性的术语也反映了其社会学背景。 不同中心性指标对 “重要” 的衡量方式不同&#xff0c;因此适用于…...

[sqoop]将hive查询后的数据导入到MySQL

一、知识点 export:将Hive的表导入到mysql叫导出 搜了很多&#xff0c;发现sqoop在hive导出到mysql时 1&#xff09;不支持where参数对数据进行过滤。 2&#xff09;不支持指定hive表的方式导出&#xff0c;只能指定Hive目录进行导出。 二、操作 1、在MySQL中建表 creat…...

Linux df、du命令

df&#xff1a;查看文件系统硬盘使用情况 df 命令&#xff0c;用于显示 Linux 系统中各文件系统的硬盘使用情况&#xff0c;包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。 df 命令的基本格式为&#xff1a; [rootlocalhost ~]# df [选项] [目录或文件名] df…...

java版+免费商城搭建+小程序商城免费搭建+Spring Cloud + Spring Boot + MybatisPlus + 前后端分离 + 二次开发

J2EE企业分布式微服务云快速开发架构 Spring CloudSpring Boot2MybatisOauth2ElementUI 前后端分离 1. 鸿鹄Cloud架构清单 2. Commonservice&#xff08;通用服务&#xff09; 通用服务&#xff1a;对spring Cloud组件的使用&封装&#xff0c;是一套完整的针对于分布式微…...

软件设计师学习第一章

计算机组成与体系结构&#xff08;6分&#xff09; 内容概述 数据的表示 进制转换 R 进制转十进制使用按权展开法&#xff0c;其具体操作方式为&#xff1a;将 R 进制数的每一位数值用 Rk 形示&#xff0c;即幂的底数是 R &#xff0c;指数为 k &#xff0c; k 与该位和小数点…...

蓝桥杯单片机第十一届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…...

IDC报告背后:大模型时代,重新理解AI公有云

大模型之于AI公有云的意义&#xff0c;在于大模型可以改变过去“手工作坊定制算法”的高成本模式&#xff0c;转向“工厂模式”&#xff0c;只需要微调和精调&#xff0c;就可以形成针对性的场景算法。 作者|葛覃 出品|产业家 一年前&#xff0c;依然有不少云计算从业者思…...

UNH-IOL Reservation 一致性测试用例【7】- 清除Reservation

Reservation 系列导航 UNH-IOL Reservation 一致性测试用例【1】- Reservation Report 命令验证 UNH-IOL Reservation 一致性测试用例【2】- Reservation注册 UNH-IOL Reservation 一致性测试用例【3】- 取消注册 UNH-IOL Reservation 一致性测试用例【4】- Reservation Acqui…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...