济南网站建设是什么,1122t,门户网站建站,免费域名注册登录1. 介绍
Express 是一个基于 Node.js 的 Web 应用程序框架#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一#xff0c;具有轻量级、灵活和功能丰富的特点。
核心概念包括路由#xff0c;中间件#xff0c;请求与响应主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一具有轻量级、灵活和功能丰富的特点。
核心概念包括路由中间件请求与响应以及模板引擎支持 2. Express应用的使用
通过npm进行安装express包
npm install express示例以下是一个最简单的Express应用程序
const express require(express);
const app express();// 路由处理 GET 请求
app.get(/, (req, res) {res.send(Hello, Express!);
});// 路由处理动态参数
app.get(/user/:id, (req, res) {res.send(User ID: ${req.params.id});
});// 启动服务器
const PORT 3000;
app.listen(PORT, () {console.log(Server is running on http://localhost:${PORT});
});3. 应用程序对象
Express的核心负责注册路由和中间件。
使用express()函数创建一个Express应用程序的实例。
const app express();4. 路由
Express提供了灵活的路由机制用于定义应用如何响应客户端的请求
get请求
用于从服务器获取资源例如网页、数据请求参数通常附加在URL的查询字符串中适用于获取数据或无敏感信息的请求
const express require(express);
const app express();app.get(/, (req, res) {res.send(欢迎访问首页);
});// 带查询参数的 GET 请求
app.get(/search, (req, res) {const query req.query; // 获取查询参数res.send(搜索内容${query.keyword});
});app.listen(3000, () console.log(服务器运行在 http://localhost:3000));访问方式直接在浏览器地址栏输入即可
http://localhost:3000/search?keywordexpress
request对象中包含了与HTTP请求相关的信息例如请求头URL参数等信息
属性描述req.params包含动态路由中的参数格式为对象。例如/user/:idreq.params.id 获取 id 参数req.query包含查询字符串参数格式为对象。例如?nameJohnreq.query.name 获取 name 参数req.body包含 POST 请求的请求体数据需要中间件解析如 express.json() 或 express.urlencoded()req.headers包含 HTTP 请求头信息格式为对象。req.headers包含 HTTP 请求头信息格式为对象req.methodHTTP 请求的方法例如GET、POST、PUT、DELETE 等req.url请求的完整 URLreq.path请求的路径部分不包括查询字符串req.hostname请求的主机名不包括端口号req.ip客户端的 IP 地址 示例简易的查找返回
const express require(express)
const file require(./test.json)
const app express();app.get(/singer/:id.html,(req,res){let {id} req.params;let result file.find(item{if (item.id Number(id)){return true;}})if (!result){res.statusCode404;renderBlock.end(h1404 NOT FOUNDh1);return;}
}) post请求
post请求则是用于向服务器提交数据例如表单数据JSON数据通常会改变服务器上的数据例如添加修改或删除资源等操作
!DOCTYPE html
htmlhead/headbodyform methodpost actionhttp://127.0.0.1:3000/submittextarea placeholder输入用户名/textareabutton登录/button/from/body
/html
const express require(express);
const app express();app.use(express.json()); // 解析 JSON 格式的请求体
app.use(express.urlencoded({ extended: true })); // 解析 URL 编码的请求体// POST 路由
app.post(/submit, (req, res) {const body req.body; // 获取请求体数据res.send(提交的数据${JSON.stringify(body)});
});app.listen(3000, () console.log(服务器运行在 http://localhost:3000));response包含了与HTTP响应相关的方法和属性用于向客户端返回数据
方法描述res.send(body)发送响应数据可以是字符串对象Buffer等res.json(body)发送 JSON 格式的响应res.status(code)设置响应状态码例如res.status(404)res.redirect(url)重定向到指定 URLres.render(view, data)渲染视图模板并发送响应需要配置模板引擎res.set(header, value)设置响应头res.cookie(name, value)设置 Cookie需要 cookie-parser 中间件res.clearCookie(name)清除指定的 Cookieres.type(type)设置content-type响应头res.sendFile()返回服务器中的文件res.end()结束响应但不发送数据 Response对象常见操作
跳转响应
app.get(/other,(req,res){res.redirect(http://www.baidu.com)})
下载响应
app.get(/other,(req,res){res.download(__dirname/package.json)})
JSON响应
app.get(/other,(req,res){res.json({name:Ricardo})})
响应文件内容
用于展示HTML文件等信息
app.get(/other,(req,res){res.sendFile(__dirname/test.html)}) 4. express中间件
中间件Middleware 是 Express 中处理请求和响应的核心机制。它是一个函数用于处理请求对象 (req)、响应对象 (res)以及在请求-响应周期中执行后续中间件的 next 方法在路由处理之前或者之后执行。
简单来讲中间件可以拦截请求、执行某些操作然后决定是否将请求传递给下一个中间件它们可以用来处理日志记录、认证、数据解析、错误处理等任务。
中间件的基本形式
function middleware(req, res, next) {// 中间件逻辑next(); // 调用 next() 将请求传递给下一个中间件
}4.1 全局中间件
每一个请求到达服务器之后都会执行全局中间件函数直接绑定到应用对象app上作用域所有或指定的路由
const express require(express);
const path require(path);
const fs require(fs);const app express();// 声明中间件函数
function recordMiddleware(req, res, next) {let { url, ip } req;fs.appendFileSync(path.resolve(__dirname, ./access.log),${url} ${ip}\r\n);next(); // 必须调用 next() 将请求传递给后续中间件或路由
}// 使用中间件
app.use(recordMiddleware);app.get(/home, (req, res) {res.send(Hello express);
});app.get(/admin, (req, res) {res.send(后台);
});// 处理 404 请求
app.all(*, (req, res) {res.send(h1404 NOT FOUND/h1);
});// 启动服务器
app.listen(3000, () {console.log(The server started on port 3000);
}); 4.2 专有/路由级中间件
与路由绑定仅作用于特定路由
function recordMiddleware(req, res, next) {let { url, ip } req;fs.appendFileSync(path.resolve(__dirname, ./access.log),${url} ${ip}\r\n);next(); // 必须调用 next() 将请求传递给后续中间件或路由
}app.get(/home, recordMiddleware,(req, res) {res.send(Hello express);
});
需要在中间件中声明next才会进一步执行之后回调函数的内容 4.3 静态资源/内置中间件
app.use(express.static(__dirname/public));
根据在public文件夹下的路径即可访问对应的文件
如果public目录下有index.html文件单独有index.html路由的话根目录代码/书写谁在前显示谁 中间件描述安装express.json()解析 JSON 格式请求体内置express.urlencoded()解析 URL 编码请求体如表单数据内置express.static()提供静态文件服务内置morgan记录 HTTP 请求日志需要安装cookie-parser解析请求中的 Cookie需要安装cors处理跨域请求需要安装helmet提高应用安全性需要安装body-parser解析请求体数据功能与 express.json() 类似需要安装express-session管理会话需要安装 示例中间件获取解析请求参数
首先准备好我们的表单界面与服务端
!DOCTYPE html
htmlhead/headbodyform actionhttp://127.0.0.1:3000/login methodpost用户名:input typetext nameusernamebr密码:input typepassword namepasswordbrbutton登录/button/form/body
/html
const express require(express)const app express();app.get(/login,(req,res){res.sendFile(__dirname/form.html)
})app.post(/login,(req,res){res.send(获取用户的数据)
})app.listen(3000,(){console.log(server is running...)
}) nameJohnage25表单所返回的数据如上述所示我们需要在服务器端获取上述表单内容需要使用到中间件
使用中间件解析post请求所获得的数据
const urlencodedParser express.urlencoded({ extended: false });
使用中间件
app.post(/login,urlencodedParser,(req,res){console.log(req.body)res.send(获取用户的数据)
})
解析后的数据存放在req中body属性中解析的内容以对象的形式进行保存
{ name: John, age: 25 }示例防盗链
防止其他网站对资源进行访问通过header请求头中refer所实现
app.use((req,res,next){let referer req.get(referer);if (referer){let url new URL(referer);let hostname url.hostname; //获取站点信息if (hostname ! 127.0.0.1){res.status(404).send(h1404 NOT FOUND/h1)}
}
}) 注意事项
1. 中间件顺序很重要中间件按照定义顺序执行。
2. 确保调用next()如果不调用后续中间件将不会执行。 5. 路由器Router
定义路由器级别的路由用于为某一组路由逻辑进行模块化管理即创建“迷你应用”。
它的作用范围是局部的绑定在特定的 Router 实例上。
反之使用app.get用于处理直接挂载到整个应用程序上的 HTTP GET 请求作用范围是全局的绑定在整个 Express 应用实例上。
const express require(express);
const app express();
const router express.Router();router.get(/about, (req, res) res.send(关于页面));
router.get(/contact, (req, res) res.send(联系我们));app.use(/info, router); // 将路由器挂载到 /info 路径app.listen(3000);最终访问路由
3000/info/about 6. 路由模块化
单独创建一个文件夹用于存储不同作用的路由文件
// ./routes/网站首页.js
const express require(express)const router express()router.get(/home,(req,res){res.send(网站首页)
})module.exports router;
模块化进行声明导出方便在主文件中进行使用 - 在主文件中配置路由使用use挂载即可
// ./主文件.jsconst express require(express);
const router require(./route/home.js)const app express();app.use(router);app.all(*,(req,res){res.send(h1404 NOT FOUNDh1)
})app.listen(3000,(){console.log(This server has been started)
})