Appearance
callback 回调函数函数里面的参数有 ,请求对象(request对象)、响应对象(response对象)、next函数(在express中定义的用于执行下一个中间件的函数)
请求对象继承自 http.IncomingMessage,响应对象继承自:http.ServerResponse,可以参考node http 模块, express 在这两个模块基础上进行了增和改动,可以说 node http 这两个模块具备的功能express 也可以用
属性/方法 | 参数 | 解释 |
---|---|---|
req.body | 包含 POST 请求体中提交的数据的对象。在使用中间件解析请求体后可用。 | |
req.cookies | 包含解析的 cookies 的对象。会自动解析 HTTP 请求中的 cookie 字段。 | |
req.get(header) | header | 获取指定请求头的值。如果请求头存在多个值,则返回第一个值。 |
req.header(header) | header | 获取指定请求头的值。如果请求头存在多个值,则返回以逗号分隔的字符串。 |
req.hostname | 返回主机名,如 "example.com"。 | |
req.ip | 返回客户端的 IP 地址。 | |
req.path | 返回 URL 的路径部分,如 "/user"。 | |
req.params | 包含以冒号标记的路由参数的对象。例如,在路由路径 /user/:id 中,如果一个请求的 URL 为/user/123,则 req.params 拥有一个属性 id,其值为 "123"。 | |
req.protocol | 返回请求协议,如 "http" 或 "https"。 | |
req.query | 包含 URL 查询参数的对象。例如,在 URL "/user?id=123" 中, req.query 拥有一个属性 id,其值为 "123"。 | |
req.secure | 如果请求通过 HTTPS 协议,则返回 true。 | |
req.url | 返回完整的 URL,包括查询参数和哈希部分。 | |
req.xhr | 如果请求通过 AJAX 发起,则返回 true。 |
属性/方法 | 参数 | 解释 |
---|---|---|
res.append(field, value) | field, value | 在响应头中添加一个值。 |
res.cookie(name, value, options) | name, value, options | 设置一个 HTTP cookie。 |
res.clearCookie(name, options) | name, options | 删除一个 HTTP cookie。 |
res.download(path, [filename], [options], [callback]) | path, filename, options, callback | 提供文件下载。 |
res.end([data], [encoding]) | data, encoding | 结束响应流,并发送响应数据。如果提供了数据,则相当于同时调用 res.write() 和 res.end()。 |
res.format(obj) | obj | 根据请求 Accept 头发送不同的响应格式。 |
res.get(field) | field | 获取响应头中指定字段的值。如果响应头存在多个值,则返回第一个值。 |
res.json([body]) | body | 发送一个 JSON 格式的响应。 |
res.jsonp([body]) | body | 发送一个 JSONP 格式的响应。 |
res.links(links) | links | 发送 Link 标头。 |
res.location(url) | url | 设置 "Location" 响应头,将客户端重定向到指定的 URL。 |
res.redirect([status,] path) | status, path | 将客户端重定向到指定的 URL。 |
res.render(view [, locals] [, callback]) | view, locals, callback | 通过模板引擎渲染模板,并发送响应。 |
res.send([body]) | body | 发送一个 HTTP 响应。针对不同类型的数据采用适当的响应头。 |
res.sendFile(path [, options] [, fn]) | path, options, fn | 发送文件。 将文件作为八位字节流发送。 |
res.setHeader(name, value) | name, value | 设置响应头的值。 |
res.status(code) | code | 设定 HTTP 响应状态码。 |
res.type(type) | type | 设置 Content-Type 响应头的值。 |
res.sendStatus() | statusCode | 用于发送HTTP状态码作为响应。它会自动设置响应头的Content-Type为text/plain,并将状态码作为响应主体发送给客户端。例如,res.sendStatus(404)将发送一个状态码为404的响应给客户端。 |
next() 是用于传递请求到下一个 middleware 或者路由处理函数中的一个函数,如果没有执行 next(),那么请求将被阻塞,无法响应客户端。如果传入了参数,则 Express 会认为这是一个错误,并交给内置的错误处理函数处理。如果在中间件函数中调用了 next("some error message"),那么这个请求会被 Express 视为发生了错误,并交给 Express 内置的 error handler 函数处理。
额外补充
客户端传递到服务器参数的方法常见的是5种:
方式一:通过get请求中的URL的params;
方式二:通过get请求中的URL的query;
方式三:通过post请求中的body的json格式;
方式四:通过post请求中的body的x-www-form-urlencoded格式;
方式五:通过post请求中的form-data格式;
简单的增删改查案例
封装一个用来操作文件读写的js 文件,这里叫做 db.js
js
const fs = require('fs')
const { promisify } = require('util')
const path = require('path')
const readFile = promisify(fs.readFile)
const writeFile = promisify(fs.writeFile)
const dbPath = path.join(__dirname, './db.json')
exports.getDb = async () => {
const data = await readFile(dbPath, 'utf8')
return JSON.parse(data)
}
exports.saveDb = async db => {
const data = JSON.stringify(db, null, ' ')
await writeFile(dbPath, data)
}
当我们要获取数据时候在 app.js 调用对应请求方法和地址
js
app.get('/todos', async (req, res) => {
try {
const db = await getDb()
res.status(200).json(db.todos)
} catch (err) {
res.status(500).json({
error: err.message
})
}
})
查找单个数据时候
js
app.post('/todos', async (req, res) => {
try {
// 1. 获取客户端请求体参数
const todo = req.body
// 2. 数据验证
if (!todo.title) {
return res.status(422).json({
error: 'The field title is required.'
})
}
// 3. 数据验证通过,把数据存储到 db 中
const db = await getDb()
const lastTodo = db.todos[db.todos.length - 1]
todo.id = lastTodo ? lastTodo.id + 1 : 1
db.todos.push(todo)
await saveDb(db)
// 4. 发送响应
res.status(201).json(todo)
} catch (err) {
res.status(500).json({
error: err.message
})
}
})
更新数据
js
app.patch('/todos/:id', async (req, res) => {
try {
// 1. 获取表单数据
const todo = req.body
// 2. 查找到要修改的任务项
const db = await getDb()
const ret = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
if (!ret) {
return res.status(404).end()
}
Object.assign(ret, todo)
await saveDb(db)
res.status(200).json(ret)
} catch (err) {
res.status(500).json({
error: err.message
})
}
})
删除数据
js
app.delete('/todos/:id', async (req, res) => {
try {
const todoId = Number.parseInt(req.params.id)
const db = await getDb()
const index = db.todos.findIndex(todo => todo.id === todoId)
if (index === -1) {
return res.status(404).end()
}
db.todos.splice(index, 1)
await saveDb(db)
res.status(204).end()
} catch (err) {
res.status(500).json({
error: err.message
})
}
})