Express入门和实践(一)
1、什么是Express?
Express是一种Node框架,是许多其他流行Node框架的底层哭,它提供了以下机制:
- 为不同URL路径中使用不同 http 动词的请求(路由)便携处理程序。
- 集成了“视图”渲染引擎,一边通过将数据插入模版来生成响应。
- 设置常见web应用设置,比如用于连接的端口,以及渲染响应模版的位置。
- 在请求处理管道的任何位置添加额外的请求处理“中间件”
Express中间件可以实现 cookie、会话、用户登录、URL参数、POST数据、安全头等功能。
2、安装Express
npm install express
3、Express代码是什么样子的?
使用 Express 可以调用特定 HTTP 动词(GET
, POST
, SET
等)函数和 URL 模式(“路由”)函数,还可以指定模板(“视图”)引擎的种类、模板文件的位置以及渲染响应所使用的模板。可以使用 Express 中间件来添加对 cookie、会话、用户、获取 POST
/GET
参数,等。可以使用 Node 支持的任何类型数据库(Express 本身没有定义任何数据库行为)。
4、导入和创建模块
可以用 Node 的 require()
函数将它们导入其他代码。Express 本身就是一个模块,Express 应用中使用的中间件和数据库也是。
const express = require("express");
const app = express();
为了让对象暴露于模块之外,只需把它们设置为 exports
对象的附加属性即可。
exports.area = (width) => {return width * width;
};
exports.perimeter = (width) => {return 4 * width;
};
可以用 require()
导入这个模块,然后调用导出的方法
const square = require("./square");
// 这里 require() 了文件名,省略了 .js 扩展名(可选)
console.log("边长为 4 的正方形面积为 " + square.area(4));
一次赋值不仅能构建一个单一的属性,还能构建一个完整的对象,可以像下面这样把对象赋值给 module.exports
module.exports = {area: (width) => {return width * width;},perimeter: (width) => {return 4 * width;},
};
5、创建路由处理器(Route handler)
app.get("/", (req, res) => {res.send("Hello World!");
});
回调函数将请求和响应对象作为参数。该函数直接调用响应的 send()
以返回字符串“Hello World!”。有许多其他响应方法可以结束请求/响应周期,例如,通过调用 res.json()
来发送 JSON 响应、调用 res.sendFile()
来发送文件。
虽然回调函数的参数命名没有限制,但是当调用回调时,第一个参数将始终是请求,第二个参数将始终是响应。合理的命名它们,在回调体中使用的对象将更容易识别。
有一个特殊的路由方法 app.all()
,它可以在响应任意 HTTP 方法时调用。用于在特定路径上为所有请求方法加载中间件。
处理程序将在监听到针对 /secret
的任意 HTTP 动词:
app.all("/secret", (req, res, next) => {console.log("访问私有文件 ...");next(); // 控制权传递给下一个处理器
});
6、使用中间件(Middleware)
中间件可以执行任何操作,运行任何代码,更改请求和响应对象,也可以结束“请求 - 响应”周期。如果它没有结束循环,则必须调用
next()
将控制传递给下一个中间件函数(否则请求将成为悬挂请求)。
大多数应用会使用第三方中间件来简化常见的 web 开发任务,比如 cookie、会话、用户身份验证、访问请求 POST
和 JSON 数据,日志记录等。
中间件和路由函数是按声明顺序调用的。一些中间件的引入顺序很重要(例如,如果会话中间件依赖于 cookie 中间件,则必须先添加 cookie 处理器)。绝大多数情况下要先调用中间件后设置路由,否则路由处理器将无法访问中间件的功能。
如何使用这两种方法添加中间件功能,以及是否使用路由:
const express = require("express");
const app = express();// 示例中间件函数
const a_middleware_function = (req, res, next) => {// ... 进行一些操作next(); // 调用 next() ,Express 将调用处理链中下一个中间件函数。
};// 用 use() 为所有的路由和动词添加该函数
app.use(a_middleware_function);// 用 use() 为一个特定的路由添加该函数
app.use("/someroute", a_middleware_function);// 为一个特定的 HTTP 动词和路由添加该函数
app.get("/", a_middleware_function);app.listen(3000);