将从如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构。接着,文章将详细讲解 Express 中间件的概念、分类以及如何有效地使用中间件来增强应用的功能和性能。最后,我们将讨论如何制定合理的接口规范,以确保 API 的一致性和可维护性。
express
模版bincli
命令下载express
模版代码bincli create express-project
cd express-project
npm install
package.json
是否安装了 nodemon,没有的话重安一下npm i nodemon
npm run dev
报错原因:运行 Express 应用时遇到了一个 ReferenceError,具体来说是因为在 app.js 文件中使用了一个未定义的变量 router。
app.js
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
function logs(req) {
console.log(`${req.method},${req.url},${Date.now()}`);
}
app.get("/", (req, res) => {
logs(req);
res.send("/home");
});
app.get("/register", (req, res) => {
logs(req);
res.send("register");
});
app.get("/login", (req, res) => {
logs(req);
res.send("/login");
});
app.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
npm run dev
postman
客服端,send
发送请求查看app.use()
是 Express 应用的一个方法,这里注册的中间件将应用于所有路由。其中(req, res, next) => { ... }
是一个箭头函数,它接受三个参数。
修改app.js
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
app.use((req, res, next) => {
console.log(`${req.method},${req.url},${Date.now()}`);
next();
});
app.get("/", (req, res) => {
res.send("/home");
});
app.get("/register", (req, res) => {
res.send("register");
});
app.get("/login", (req, res) => {
res.send("/login");
});
app.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
注意:在 Express 应用中,中间件的执行顺序非常重要,因为它决定了请求处理的流程。app.use() 方法用于注册中间件函数,这些函数会按照它们被注册的顺序依次执行。如果中间件没有正确放置,可能会导致请求不经过预期的中间件处理,从而影响应用的行为。
应用程序级别中间件是绑定到 Express 应用实例的中间件。它对所有路由和请求都有效。
使用场景:适用于全局的请求处理,如日志记录、身份验证等。
app.use(function (req, res, next) {
// 执行中间件逻辑
next();
});
路由级别中间件是绑定到特定路由的中间件。它只对特定路由的请求有效。
使用场景:适用于特定路由的请求处理,如特定路径的权限检查、数据预处理等
app.js
app.get(
"/",
function (req, res, next) {
console.log(req.method);
next();
},
function (req, res, next) {
console.log("route");
next();
}
);
npm run dev
错误处理中间件用于捕获和处理在中间件链中发生的错误。
使用场景:通常放在所有其他中间件之后,以便捕获所有未处理的错误。
app.use(function (err, req, res, next) {
// 处理错误
console.error(err.stack);
res.status(500).send("服务器内部错误");
});
Express 内置了一些中间件函数,用于处理常见的任务。
express.static
:用于提供静态文件服务。
express.json()
:用于解析 JSON 格式的请求体。
express.urlencoded()
:用于解析 URL 编码格式的请求体。
router/index.js
const express = require("express");
const router = express.Router();
router.get("/", (req, res, next) => {
console.log(req.method);
res.send("/home");
});
router.get("/user", (req, res, next) => {
console.log(req.method);
res.send("/users");
});
module.exports = router;
app.js
const express = require("express");
const router = require("./router/index.js");
const app = express();
app.use(router);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
npm run dev
const express = require("express");
const router = require("./router/index.js");
const app = express();
// 任何以 'node' 开头的请求路径都会被这个路由处理器处理。
app.use("node", router);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
npm run dev
未添加node
前缀显示请求错误
添加node
前缀后
app.use((req, res, next) => {
res.status(404).send("404 Not Found");
});
app.use((err, req, res, next) => {
console.log(err);
res.status(500).send("Service Error");
});
第三方中间件是由社区开发的中间件,提供了各种功能扩展。
const cors = require("cors");
const morgan = require("morgan");
app.use(cors());
app.use(morgan("combined"));
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。