express 的入门学习笔记
https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Express_Nodejs
// 调用 HTTP 模块
const http = require("http");
// 创建 HTTP 服务器并监听 8000 端口的所有请求
http.createServer((request, response) => {
// 用 HTTP 状态码和内容类型来设定 HTTP 响应头
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应体 "Hello World"
response.end('Hello World\n');
}).listen(8000);
// 在控制台打印访问服务器的 URL
console.log('服务器运行于 http://127.0.0.1:8000/');
Node 本身并不支持其它常见的 web 开发任务。如果需要进行一些具体的处理,比如运行其它 HTTP 动词(比如 GET、POST、DELETE 等)、分别处理不同 URL 路径的请求(“路由”)、托管静态文件,或用模板来动态创建响应,那么可能就要自己编写代码了,亦或使用 web 框架,以避免重新发明轮子。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('示例应用正在监听 3000 端口!');
});
app.get(’/’,callBack)监听’/'下的get动词, app.all()可以监听http所有动词
动词的统计
checkout(), copy(), delete(), get(), head(), lock(), merge(), mkactivity(), mkcol(), move(), m-search(), notify(), options(), patch(), post(), purge(), put(), report(), search(), subscribe(), trace(), unlock(), unsubscribe().
接获路由的请求之后,除了send有许多其它响应方法 可以结束请求/响应周期
res下表中响应对象()的方法可以向客户端发送响应,并终止请求 - 响应周期。如果没有从路由处理程序调用这些方法,则客户端请求将保持挂起状态。
方法 | 描述 |
---|---|
res.download() | 提示下载文件。 |
重发() | 结束响应过程。 |
res.json() | 发送JSON响应。 |
res.jsonp() | 使用JSONP支持发送JSON响应。 |
res.redirect() | 重定向请求。 |
res.render() | 渲染视图模板。 |
res.send() | 发送各种类型的回复。 |
res.sendFile() | 将文件作为八位字节流发送。 |
res.sendStatus() | 设置响应状态代码并将其字符串表示形式作为响应主体发送。 |
可以为站点的特定部分提供一组路由处理器(使用公共路由前缀进行组合)。(比如对于一个有 维基(Wiki)内容的站点,可以把所有 Wiki 相关的路由放在同一个文件里,使用路由前缀 ‘/wiki/’ 访问它们)。在 Express 中可以使用 express.Router 对象实现。例如,可以把所有维基相关的路由都放在一个 wiki.js 模块中,然后导出 Router 对象,如下:
// wiki.js - 维基路由模块
const express = require('express');
const router = express.Router();
// 首页路由
router.get('/', (req, res) => {
res.send('维基首页');
});
// “关于”页面路由
router.get('/about', (req, res) => {
res.send('关于此维基');
});
module.exports = router;
const wiki = require('./wiki.js');
// ...
app.use('/wiki', wiki);
路径参数是命名的 URL 段,用于捕获在 URL 中的位置指定的值。命名段以冒号为前缀,然后是名称(例如 /:your_parameter_name/
。捕获的值保存在 req.params 对象中,键即参数名(例如 req.params.your_parameter_name
)
http://localhost:3000/users/34/books/8989
,可以这样提取信息(使用 userId
和 bookId
路径参数):
app.get('/users/:userId/books/:bookId', (req, res) => {
// 通过 req.params.userId 访问 userId
// 通过 req.params.bookId 访问 bookId
res.send(req.params);
});
res.redirect('/catalog');
中间件函数通常是对请求或响应执行某些操作,然后调用“栈”里的下一个函数,中间件可以更改请求和响应对象,也可以结束“请求 - 响应”周期。如果它没有结束循环,则必须调用 next() 将控制传递给下一个中间件函数
中间件其实就是一个function 接收 请求和返回报文 以及next函数 三个参数。
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);
const express = require('express');
const logger = require('morgan');
const app = express();
app.use(logger('dev'));
可以使用 express.static 中间件来托管静态文件,包括图片、CSS 以及 JavaScript 文件(其实 static() 是 Express 提供的原生中间件函数之一)
app.use(express.static('public'));
app.use(’/media’, express.static(‘public’));
给public 换个地址,现在可以通过 ‘/media’ 路径前缀来访问 ‘public’ 文件夹中的文件。
http://localhost:3000/media/images/dog.jpg
http://localhost:3000/media/video/cat.mp4
http://localhost:3000/media/cry.mp3
用来处理错误的特殊中间件函数有四个参数(err, req, res, next),而不是之前的三个。例如:
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('出错了!');
});
支持的数据库
具体使用方式数据库使用
模板引擎可为输出文档的结构指定一个模板,在数据处先放置占位符,并于页面生成时填充。模板通常用于生成 HTML,也可以生成其它类型的文档。Express 支持 多个版本的模板引擎,可以参阅:JavaScript 模板引擎对比评测:Jade、Mustache、Dust与其它。
const express = require('express');
const app = express();
// 设置包含模板的文件夹('views')
app.set('views', path.join(__dirname, 'views'));
// 设置视图引擎,比如'some_template_engine_name'
app.set('view engine', 'some_template_engine_name');
安装express-generator
$ npm install express-generator -g
创建
$ express helloworld
安装类库
$ npm install
启动
npm start