Nodejs的学习Ⅵ(express、ejs模板、关于get与post请求、中间件、nodemon与pm2、app.js文件的说明)

2023-11-13

一、express的简单介绍与安装

ndoe.js,一个基于javsscript的服务器环境,它的出现使得javascript有能力去实现服务器操作。
而基于node.js的Express则把原先的许多操作变的简单灵活,一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。
express官网

Express的安装

其实express的安装可以省略,因为 可以用express的脚手架来生成这一切

cnpm install express --save			// 安装
express --version					// 查看express是否安装成功,如果显示版本号,则安装正确

Express脚手架的安装

方法1、使用express-generator安装
npm install express-generator -g	// 安装
express -h							// 查看命令行的指令含义

// 结果:
Options:
    --version        输出版本号
-e, --ejs            添加对 ejs 模板引擎的支持
    --pug            添加对 pug 模板引擎的支持
    --hbs            添加对 handlebars 模板引擎的支持
-H, --hogan          添加对 hogan.js 模板引擎的支持
-v, --view <engine>  添加对视图引擎(view) <engine> 的支持 (ejs|hbs|hjs|jade|pug|twig|vash) (默认是 jade 模板引擎)
    --no-view        创建不带视图引擎的项目
-c, --css <engine>   添加样式表引擎 <engine> 的支持 (less|stylus|compass|sass) (默认是普通的 css 文件)
    --git            添加 .gitignore
-f, --force          强制在非空目录下创建
-h, --help           输出使用方法
express --view=ejs app				// 创建了一个名为 app 的 Express 应用,并使用ejs模板引擎
cd myapp							// 进入app目录
npm install							// 安装依赖
set DEBUG=app:* & npm start			// 在Windows 下,使用该命令启Express应用
DEBUG=app:* npm start				// 在 MacOS 或 Linux 下,使用该命令启Express应用

最后输出结果:
在这里插入图片描述

// app文件内的目录:
bin: 启动目录 里面包含了一个启动文件 www 默认监听端口是 3000 (直接node www执行即可)
node_modules:依赖的模块包
public:存放静态资源
routes:路由操作
views:存放ejs模板引擎
app.js:主文件
package.json:项目描述文件
方法2:使用 express 命令 来快速从创建一个项目目录
express app -e						// express 项目文件夹的名字 -e 
cd app								// 使用命令行进入项目目录
cnpm install						// 安装依赖

二、Express路由简介与路由使用

路由简介

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

app.methods(path, callback);

app.get('/', (request, response) => {		// 举例
  response.send('<h1>hi,there</h1>')
})

路由方法

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。

Express路径与动态路由

Express路径包含三种表达形式,分别为字符串、字符串模式、正则表达式

1.字符串路径
app.get("/login",function(req,res){
	res.send("hi ,there!");
})

此路径地址将与/login匹配

2.字符串模式路径(类似于正则表达式模式)

此路由路径将与acdabcd相匹配。

app.get('/ab?cd', function (req, res) {
  res.send('ab?cd')
})

这条路线的路径将会匹配abcdabbcdabbbcd,这里只需要以ab开头,cd结尾即可。

app.get('/ab+cd', function (req, res) {
  res.send('ab+cd')
})

这条路线的路径将会匹配abcdabxcdabRANDOMcdab123cd,等。

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')
})
3.正则表达式路径

此路由路径将匹配其中带有a的任何内容,因为路径 带有/ 所以需要使用转义

app.get(/\/a/, function (req, res) {
  res.send('home')
})

这条路线的路径将匹配butterflydragonfly

app.get(/.*fly$/, function (req, res) {
  res.send('/.*fly$/')
})

不过在使用正则表达式里面的特殊字符时需要使用转义

4.动态路由

路由参数被命名为URL段,用于捕获URL中在其位置处指定的值。捕获的值将填充到req.params对象中,并将路径中指定的route参数的名称作为其各自的键。

Request URL: http://localhost:3000/users/34/books/8989
Route path: /users/:userId/books/:bookId					// 匹配的URL段
req.params: { "userId": "34", "bookId": "8989" }			// 获得的对象

Request URL: http://localhost:3000/profile/userlihua
Route path: /profile/user:name
req.params: { "name": "lihua" }

使用路由参数定义路由,只需在路由路径中指定路由参数,如下所示。

app.get('/users/:userId/books/:bookId', function (req, res) {
  res.send(req.params)
})

路径参数的名称必须由“文字字符” ([A-Za-z0-9_]) 组成。

由于连字符(-)和点(.)是按字面解释的,因此可以将它们与路由参数一起使用

Request URL: http://localhost:3000/flights/LAX-SFO
Route path: /flights/:from-:to
req.params: { "from": "LAX", "to": "SFO" }

Request URL: http://localhost:3000/plantae/Prunus.persica
Route path: /plantae/:genus.:species
req.params: { "genus": "Prunus", "species": "persica" }

要更好地控制可以由route参数匹配的确切字符串,可以在括号()中附加一个正则表达式

Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}

由于正则表达式通常是文字字符串的一部分,因此请确保使用\对其他特殊字符进行转义
Express 4.x中,不以常规方式解释正则表达式中*字符。解决方法是使用{0,}代替*。这可能会在Express 5中修复。

路线处理程序

程序是在路由上施加先决条件,如果在没有使用next的情况下,则将不会路由的控制权传递给后续回调函数

路由处理程序可以采用函数函数数组二者组合的形式,如以下示例所示。

单个回调函数可以处理路由。例如:
app.get('/example/a', function (req, res) {
  res.send('Hello from A!')
})
多个回调函数可以处理一条路由(确保指定了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!')
})
回调函数数组可以处理路由。例如:
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])
独立功能和功能数组的组合可以处理路由。例如:
var cb0 = function (req, res, next) {
  console.log('CB0')
  next()
}

var cb1 = function (req, res, next) {
  console.log('CB1')
  next()
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('the response will be sent by the next function ...')
  next()
}, function (req, res) {
  res.send('Hello from D!')
})

response方法

这里的res就是response

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

路由模块

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

birds.js下:

var express = require('express')
var router = express.Router()

// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
  console.log('Time: ', Date.now())
  next()					// 必须调用next方法
})
// define the home page route
router.get('/', function (req, res) {
  res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
  res.send('About birds')
})

module.exports = router

然后,在应用程序(app.js)中加载路由器模块

var birds = require('./birds')
// ...
app.use('/birds', birds)

该应用程序现在将能够处理对/birds/birds/about的请求,以及调用timeLog特定于该路线的中间件功能。

app.set(name, value)

该方法的目的是给name赋值,也就是给变量赋值

app.set('title', 'My Site')						// 通过set方法赋值
app.get('title') // "My Site"					// 通过get方法取值

三、express的ejs模板

简介

相比于jade模板引擎,ejs对原HTML语言就未作出结构上的改变,只不过在其交互数据方面做出了些许修改,相比于jade更加简单易用。因此其学习成本是很低的。
您也可参考ejs官网

ejs基本使用

app.js文件:

const express=require("express");
const ejs=require("ejs");							// 引入ejs
const fs=require("fs");

var app=express();

app.set('views', path.join(__dirname, 'views'));	// 设置视图的对应目录,前一参数为变量名(一般取为视图的文件名),后一参数为视图的路径
app.set("view engine","ejs");						// 设置默认的模板引擎
app.engine('ejs', ejs.__express);					// 定义模板引擎

app.get("/",function(req,res){
	res.render("index.ejs",{title: "<h4>express</h4>"});	// 使用render来渲染模板,且要注意这里面的第二个参数必须为对象
});

ejs文件:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<% for(var i=0;i<10;i++){ %>				//  js的语法
			<%= i %>								// 输出为:0 1 2 3 4 5 6 7 8 9 
		<% } %>
		<% if(i == 10) { %>							// 为true
            <h1>i == 10</h1>						// 输出为:i == 10
            <h1>
                <%- i %>							//输出为:10 
            </h1>
        <% } %>
		<!-- 获取变量 -->
		<div class="datas">
			<p>获取变量:</p>
			<%- title %>							// 输出非转义的数据到模板,结果为:express的h4标签
			<%= title %>							// 输出数据到模板(数据是转义 HTML 标签),结果为:&lt;h4&gt;express&lt;/h4&gt;
		</div>
	</body>
</html>

这时我们会得到如下图的结果:
在这里插入图片描述
由此可以知道:

<% xxx %>:里面写入的是js语法,
<%= xxx %>:里面接受服务端发送给ejs模板的变量,不会解析变量里面的值(带<>符号),之所以输出类似与<h1>xxx</h1>,是因为对变量里的值(<>)进行了转义
<%- xxx %>:里面接受服务端发送给ejs模板的变量,会解析变量里面的值(会解析<>),输出XXX
<%# 注释标签,不执行、不输出内容

ejs标签各种含义

<% 		'脚本' 标签,用于流程控制,无输出。
<%_ 	删除其前面的空格符
<%= 	输出数据到模板(输出是转义 HTML 标签)
<%- 	输出非转义的数据到模板
<%# 	注释标签,不执行、不输出内容
<%% 	输出字符串 '<%'
%> 		一般结束标签
-%> 	删除紧随其后的换行符
_%> 	将结束标签后面的空格符删除

另外res.render()函数也是支持回调的,例如:

res.render('user', { name: 'Tobi' }, function(err, html) {
  console.log(html);
});

另外值得说明的是ejs模块也有ejs.render()和ejs.renderFile()方法,他在这里与res.render()作用类似,如下:

ejs.render(str, data, options);

ejs.renderFile(filename, data, options, function(err, str){
    // str => 输出绘制后的 HTML
});

四、express内的get请求

关于get一些说明

一般在网站开发中,get都用作数据获取和查询,且在发送请求后,可通过req.query对象可以获得用户发送的数据
实例

app.get("/login",function(req,res){
    console.log(req.query);
    res.send("登录路由,user为:"+req.query.username+"==>   password为:"+req.query.password);
});

五、express内的POST请求

关于post一些说明

相比于get请求,post所请求的数据会更加安全。
get请求会在地址栏显示输入的用户名和密码(有中文时会转化为BASE64加密),而post请求则会将数据放入http包的包体中,这使得别人无法直接看到用户名和密码!
我们的知道,首先我们得知道在form表单进行post请求enctype属性一般设置为 “application/x-www-form-urlencoded”,如果设置成multipart/form-data,则多用于文件上传

app.use(express.urlencoded({ extended: false }))// 设置解析中间件,用来解析post提交的数据

req.body.username 								// 获取post请求的数据

案例:

app.use(express.urlencoded({ extended: false }))//处理登陆请求
app.post('/login',async (req,res)=>{
	console.log(req.body);
    res.send("登录路由,user为:"+req.body.username+"==>   password为:"+body.query.password);
})

六、express内的中间件

从字面意思,我们可以了解到它大概就是做中间代理操作,事实也是如此;大多数情况下,中间件就是在浏览器发送请求服务器发送响应中间的一系列操作
事实上,express一个路由和中间件web框架

中间件函数 可以执行以下任务:执行任何代码;对请求和响应对象进行更改;结束请求/响应循环;调用堆栈中的下一个中间件函数。

中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件,且中间件自带两个参数(request、response)
下面分别对以下进行说明:

1.应用层中间件

应用级中间件绑定到app对象使用app.use和app.METHOD()
app.use([path,] callback [, callback…]) 是指定的一个或多个中间件函数安装在指定的路径上:当所请求路径的基数与path匹配时,将先执行中间件函数(截获),且当参数path省略时则默认为\(即访问任何页面,函数都会被调用)
app.METHOD(path, callback [, callback …])用于处理http请求,例如GET、PUT、POST,其实际的方法就是app.get()、app.post()、app.put()
例如下面实例:

app.use(function(req,res,next){
    console.log("访问任何页面,该函数都会被调用,且会在app.get()、app.post()等等之前被调用");
    next();
});

不过要注意的是如果不调用next方法那么地址会一直加载,因为我们在中间件里截取了函数,而如果要解决这个问题的话则需要调用next方法

2.路由中间件

路由级中间件和应用级中间件类似,只不过他需要绑定express.Router([options]),且他是为了配置复杂路由

var router = express.Router()

在匹配路由时,我们使用 router.use() 或 router.VERB() ,路由中间件若多次结合callback则可用于用户登录及用户状态检测。
例如:

// profile.js文件
var express = require('express');
var router=express.Router();
​
router.use("/user",function(req,res,next){
    console.log("分类:",req.originalUrl);		
    next();
},function(req,res){
    res.send("JavaScript");
});

module.exports = router;
// app.js文件
var app = express();            				// 创建app对象
var indexRouter = require('./routes/index');

app.use("/category",router);					// 配置路由界面

3.错误处理中间件

顾名思义,它是指当我们匹配不到路由时所执行的操作错误处理中间件和其他中间件基本一样,只不过其提供了4个自变量参数

var createError = require('http-errors');

// 处理404的中间件
app.use(function(req, res, next) {
  // 可以用该res.render('404.html');语句来生成好看的404页面,但是下面的next必须注释,
  // 且生成的404页面就会盖住错误信息
  next(createError(404));
});

// 处理错误的中间件
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

一般情况下,我们把错误处理放在最下面,这样我们即可对错误进行集中处理。

4.内置中间件

从版本4.x开始,Express不再依赖Content,也就是说Express以前的内置中间件作为单独模块,express.static是Express的唯一内置中间件。

express.static(root, [options]);

通过express.static我们可以指定要加载的静态资源

5.第三方中间件

它采用引入 外部模块 的方式来获得更多的应用操作。如后期的cookie和session。

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

七、nodemon与pm2

nodemon

nodemon可在检测到目录中的文件更改时通过 自动重新启动节点应用程序来帮助开发基于node.js的 应用程序(热刷新) ,不过他是用于 开发阶段的工具

npm install -g nodemon				// 安装

// nodemon的使用
node main.js						// 启动文件,不能热刷新
nodemon main.js						// 启动文件,可以热刷新

pm2

PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境,和Nodemon相似的地方在于他会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在程序遭遇到崩溃的时候,他会正确重启你的app,并且pm2会在后台运行

npm install pm2 -g					// 安装

// pm2的使用
pm2 start main.js

八、app.js文件的说明

该网站目录访问顺序**:匹配/ => 匹配/users => 匹配/(默认)**
过程中只要一render则顺序链被打断 ,所以说app.js文件的执行是严格从上到下的

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');			// 导入首页路由
var usersRouter = require('./routes/users');			// 导入用户路由

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));		// 添加视图路径
app.set('view engine', 'ejs');							// 设置视图模板的引擎

app.use(logger('dev'));									// 开发时的日志
app.use(express.json());								// 服务器端的JSON解析
app.use(express.urlencoded({ extended: false }));		// 设置POST数据的解析
app.use(cookieParser());								// 设置cookie的解析
app.use(express.static(path.join(__dirname, 'public')));// 设置静态文件的解析

app.use('/', indexRouter);								// 首页路由
app.use('/users', usersRouter);							// 用户路由

// 处理404的中间件,且要注意这里的顺序是在其他的路由之后的
app.use(function(req, res, next) {
  // 可以用该res.render('404.html');语句来生成好看的404页面,但是下面的next必须注释,
  // 且生成的404页面就会盖住错误信息
  next(createError(404));
});

// 处理错误的中间件
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;						// 设置错误信息
  res.locals.error = req.app.get('env') === 'development' ? err : {};	// 判断当前环境是否为开发环境,并以此输出内容

  // render the error page
  res.status(err.status || 500);						// 设置错误状态码
  res.render('error.ejs');
});

module.exports = app;

本文只用于个人学习与记录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs的学习Ⅵ(express、ejs模板、关于get与post请求、中间件、nodemon与pm2、app.js文件的说明) 的相关文章

  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • Chrome/Firefox 在后台发送两个 POST,间隔恰好 5 秒,仅调用一次来获取 Nodejs 8.0.0 服务器

    注意 这不是飞行前选项 也不是网站图标或其他类似内容 实际上是 2 个帖子 下面有一个屏幕截图可以更清楚地显示这一点 我的规格 版本 macOS 塞拉利昂版本 10 12 3 Chrome 版本 61 0 3128 0 官方版本 开发版 6
  • Node JS - 如何检测用户语言

    我正在尝试在纯 Node js 中检查用户语言 而不使用 npm 的任何扩展 我使用了进程和全局命令 有很多规范但我找不到系统语言 这是获取默认区域设置的独立于操作系统 节点 浏览器的方法 let locale Intl DateTimeF
  • 如何解决 Socket.io 404(未找到)错误?

    我正在使用 Socket io 和 Express 在我的项目中 我有一个登录页面和一个主页 当我成功登录时 我导航到 localhost 3000 home 并收到以下错误 GET http localhost 3000 socket i
  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • Node.js 重写 toString

    我试图覆盖我的对象的默认 toString 方法 这是代码和问题 function test this code 0 later on I will set these this name test prototype toString f
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • Node.js 和 Passport 对象没有 validPassword 方法

    我正在使用 Node js Express Passport 创建一个简单的身份验证 本地 到目前为止我所达到的效果是 当输入错误的用户名或密码时 用户将被重定向到错误页面 但是当用户输入正确的用户名和密码时 我收到此错误 node mod
  • 使用 Sequelize 实现单表继承

    有没有办法使用sequelize来创建单表继承 我希望有一个用于购买和 PartialPurchase 模型的 STI 其中我将有一个类型字段 该字段为 Purchase 或 PartialPurchase 以及类 Purchasing 和
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Mongoose 和 Promise:如何获取查询结果数组?

    使用猫鼬从数据库和 Q 中查询结果以获取承诺 但发现很难只获取可用用户列表 目前我有一些这样的东西 var checkForPerson function person people mongoose model Person Person
  • PrototypeJS 版本 1.6.0.2 覆盖 JSON.parse 和 JSON.stringify 并破坏 socket.io 功能

    基本上 socket io 使用 nativeJSON 来编码和解码数据包 而我的问题是我必须使用这个版本的原型来改变 JSON 行为 当我应该进入服务器时 如下所示 socket on event function a b c 我明白了s
  • 如何在node.js中的一定时间后强制解决承诺? [复制]

    这个问题在这里已经有答案了 我正在尝试从其 url 下载大量图像 然后在 Node js 中创建一个 PDF 文件 我正在使用图片下载器 https www npmjs com package image downloader模块下载承诺链
  • 猫鼬不创建索引

    我最近开始使用 Mongoose v 3 2 1 但我遇到了索引问题 我在我的模式 Schema path attr index true 上定义了几个索引 但它们不是在数据库中创建的 我在 shell 中运行 db collection
  • node.js 安装向导提前结束

    我无法安装 node js 0 8 9 我是通过安装向导完成的 每次安装结束时我都会收到消息 Node js 安装向导提前结束 会是什么呢 谢谢 这可能会对将来的某人有所帮助 我从安装程序中收到类似的消息 发现我可以转到命令提示符并使用命令
  • 运行“npm install”:Node-gyp 错误 - MSBUILD.exe 失败,退出代码:1

    我在跑npm install在 Windows 上安装我的项目中的所有软件包 然后我收到有关 MSBUILD exe 的错误 gyp ERR stack Error C Program Files x86 Microsoft Visual
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 如何以非阻塞方式在 Node.js 中搜索数组?

    我有一个数组是 4ff023908ed2842c1265d9e4 4ff0d75c8ed2842c1266099b 我必须找出以下内容是否在该数组内 4ff0d75c8ed2842c1266099b 这是我写的 Array prototyp

随机推荐

  • 网络层——IP协议及IP地址总结

    基本概念 在复杂的网络环境中确定一个合适的路径 主机 配有IP地址 但是不进行路由控制的设备 路由器 既然 配有IP地址 又能进行路由控制 节点 主机和路由器的统称 IP协议的功能 寻址和路由 根据对方的IP地址 寻找出最佳的路径传输信息
  • 数组下标的别致用法

    数组常识 common sense 当一个数组被创建 数组下标都是从0开始计数的 例如 创建了一个名为 arr 的数组 可以通过 arr i 来读取数据 arr 为数组名 i 为数组下标 arr i 在编译器内部会被读取转换为另外一种形式
  • 清华 NLP 团队推荐:必读的77篇机器阅读理解论文

    https mp weixin qq com s 2VhgEieBwXymAv2qxO3MPw 导读 机器阅读理解 Machine Reading Comprehension 是指让机器阅读文本 然后回答和阅读内容相关的问题 阅读理解是自然
  • C语言 学生成绩管理 txt存储数据

    include
  • SQL注入基础知识

    1 注入分类 1 根据注入点分 数值型注入 不需要考虑闭合 和字符型注入 搜索型注入 即文本框注入 2 根据注入方式分 联合注入 报错注入 盲注 二次注入 堆叠注入 宽字节注入 3 根据请求方式注入分 GET型注入 POST型注入 HEAD
  • 麦克风阵列波束形成

    我的书 淘宝购买链接 当当购买链接 京东购买链接 波束形成 beamforming 体现的是声源信号的空域选择性 许多传统波束形成方法具有线性处理结构 波束形成需要考虑三个方面 1 麦克风阵列个数 2 性能 3 鲁棒性 在麦克风较少时 波束
  • Redis实现投票功能

    一 背景介绍 投票功能是一个非常常见的Web应用场景 SpringBoot作为当今流行的Web开发框架 为了提高开发效率和性能 通常需要整合一些第三方组件 Redis是一种高性能的键值对存储数据库 而Mybatis plus则是Mybati
  • Kubernetes资源对象Pod、ReplicaSet、Deployment、Service之间的关系

    docker k8s教程 Pod ReplicaSet Deployment Service之间的关系如下图 Pod Pod是一个或多个容器的组合 这些容器共享存储 网络和命名空间 以及如何运行的规范 Pod是Kubernetes的最小可部
  • 关于新光源建设的一些想法

    表格里颜色没法调 建议的飞书版本有颜色 一些建议 对大批量使用的设备 模块 器件 材料以及基础软件架构等不要对进口产生依赖 尽可能选用国产 助力产业 方案公开评价提意见 要让我们做的每个系统拿出去都可以当个标杆推广才好 依赖进口的部分是硬伤
  • 使用自动化工具saltstack编译安装lnmp环境

    使用自动化工具saltstack编译安装lnmp环境
  • html转义字符和选择器(详)

    目录 转义字符 伪类选择器 代码解析 伪元素选择器 转义字符 转义字符 某些字符具有特殊意义 无法直接显示 需要转义 nbsp 不断行的空格 ensp 半方大的空格 emsp 全方大的空格 lt 小于 lt gt 大于 gt amp 符号
  • 安达发

    近几年来 企业对生产效率和管理水平的要求越来越高 为了提高生产效率 降低生产成本 许多企业开始引入先进的生产计划与调度系统 APS 实现生产过程的自动化 智能化管理 APS排产软件是一种能够根据企业的生产任务 资源状况 交货期等因素 自动生
  • Android开发错误——Android Studio中遇到过的错误问题与解决方案汇总

    1 编译时发生 Error 25 0 Gradle DSL method not found compile Possible causes ul li The project AP may be using a version of Gr
  • Mybatis代码生成器——让Java开发更高效

    Mybatis是一款优秀的ORM框架 在Java开发中广泛应用 然而 手写Mybatis代码工作量大 效率低 而Mybatis代码生成器可以帮助开发人员自动生成基本的CRUD代码 极大地提高了开发效率 本文将介绍如何使用Mybatis代码生
  • Modelling Uncertainty in Deep Learning for Relocaliz基于不确定性建模的DL相机重定位

    本博客仅为作者记笔记之用 不对之处 望见谅 欢迎批评指正 更多相关博客请查阅 http blog csdn net weixin 39779106 如需转载 请附上本文链接 http blog csdn net weixin 3977910
  • Calico介绍

    Calico 是一个基于 BGP 的纯三层的网络方案 与 OpenStack Kubernetes AWS GCE 等云平台都能够良好地集成 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来
  • 解决gcc编译链接含weak函数的库文件出现的一些BUG_2019/03/13

    项目介绍 本项目包含IAP程序与APP程序 APP程序有部分共用代码 包括main stm32标准库 RTOS BSP 都编译进库中 另外部分特殊代码由其它程序生成后 连接共用代码库生成目标bin文件 通过IAP下载至FLASH中 问题描述
  • java 线程同步_java中线程同步的几种方法

    展开全部 线程同步62616964757a686964616fe4b893e5b19e31333365653330主要有以下种方法 示例中是实现计数的功能 1 同步方法 即使用synchronized关键字修饰方法 例如 public sy
  • 每日一题(链表中倒数第k个节点)

    每日一题 链表中倒数第k个节点 链表中倒数第k个结点 牛客网 nowcoder com 思路 如下图所示 此题仍然定义两个指针 fast指针和slow指针 假设链表的长度是5 k是3 那么倒数第3个节点就是值为3的节点 那么我们可以先让fa
  • Nodejs的学习Ⅵ(express、ejs模板、关于get与post请求、中间件、nodemon与pm2、app.js文件的说明)

    一 express的简单介绍与安装 ndoe js 一个基于javsscript的服务器环境 它的出现使得javascript有能力去实现服务器操作 而基于node js的Express则把原先的许多操作变的简单灵活 一系列强大特性帮助你创