Skip to content
快速预览

express回调函数中参数

✍️ w 🕒 2023-06-06 08:22:52(a year ago) 🔗 B.NodeJS学习 服务端 express

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
    })
  }
})

Released under the MIT License.