首页 > 解决方案 > 如何将数据从快速验证中间件传递到下一个函数?

问题描述

我有一个看起来像这样的快速应用程序。

const app = require('express')();

// Task model
const Task = require('./models/Task');
const { param, validationResult } = require('express-validator');

const getTaskValidations = [
  param('id')
    .custom(async (id, { req }) => {
      try {
        const task = await Task.findOne({ _id: id, user: req.user.id });
        if (!task) Promise.reject('Task not found');
      } catch (err) {
        // Handle error
      }
    })
]

const validate = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(401).json({ message: errors.array()[0].msg });
  }
  next();
}

// Get Task by id
app.get('/tasks/:id', getTaskValidations, validate, async (req, res) => {
  try {
    const task = await Task.findById(req.params.id);
    res.json(task)
  } catch (err) {
    // Handle err
  }
})

我想通过 id 获取任务。在GET tasks/:idreq.params.id 中将包含任务的 id。
任务模型如下所示

{
  id: 
  task: 
  user:
}

通过查看端点,很明显我正在传递两个中间件。第一个中间件getTaskValidations将检查任务是否会给出 id 和 req.user 是否存在。第二个中间件validate将检查错误。然后再次查询数据库的任务并将数据发送到客户端,导致 2 个数据库查询。我怎样才能重用在中间件task中获得的相同内容。getTaskValidations

标签: node.jsexpressmongooseexpress-validator

解决方案


您可以像这样将查询结果添加到 req.body.task

const getTaskValidations = [
  param('id')
    .custom(async (id, { req }) => {
      try {
        const task = await Task.findOne({ _id: id, user: req.user.id });
        req.body.task = task
        if (!task) Promise.reject('Task not found');
      } catch (err) {
        // Handle error
      }
    })
]

在控制器中

app.get('/tasks/:id', getTaskValidations, validate, async (req, res) => {
  try {
    let {task} = req.body
    res.json(task)
  } catch (err) {
    // Handle err
  }
})

推荐阅读