node.js - 如何将数据从快速验证中间件传递到下一个函数?
问题描述
我有一个看起来像这样的快速应用程序。
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/:id
req.params.id 中将包含任务的 id。
任务模型如下所示
{
id:
task:
user:
}
通过查看端点,很明显我正在传递两个中间件。第一个中间件getTaskValidations
将检查任务是否会给出 id 和 req.user 是否存在。第二个中间件validate
将检查错误。然后再次查询数据库的任务并将数据发送到客户端,导致 2 个数据库查询。我怎样才能重用在中间件task
中获得的相同内容。getTaskValidations
解决方案
您可以像这样将查询结果添加到 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
}
})
推荐阅读
- c# - Unity 中的网格分析着色器,类似于运行时的 Blender 网格分析
- javascript - 如何根据 cookie 值从页面中删除元素?
- testing - 在使用 1 个线程进行一个循环并在线程组内使用吞吐量控制器时,测试计划未得到执行
- css - 如何在反应样式的组件中添加“标题”标签(用于工具提示)
- laravel - Vuejs public 文件夹 vs laravel storage/app/public 来存储图片
- reactjs - 管理多个状态数组搜索并保留原始状态数组?
- string - 与字符串操作不同
- java - 将 Cloud Firestore 时间戳转换为可读日期
- three.js - 在 AFrame 场景中设置人脸渲染的最大范围
- networking - 带有正文参数的 Http 发布请求不起作用