node.js - 错误:在中间件中发送标头以进行 joi 验证后无法设置标头
问题描述
我为 joi 验证错误处理创建了一个中间件,但它返回一些警告,例如“错误:发送后无法设置标头”
错误:
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (D:\nodejs\bigfish\node_modules\express\lib\response.js:767:10)
at ServerResponse.send (D:\nodejs\bigfish\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (D:\nodejs\bigfish\node_modules\express\lib\response.js:267:15)
at Object.JSONResponse [as JR] (D:\nodejs\bigfish\helpers\JsonResponse.js:3:29)
at module.exports (D:\nodejs\bigfish\middlewares\error.js:8:14)
at newFn (D:\nodejs\bigfish\node_modules\express-async-errors\index.js:12:20)
at Layer.handle_error (D:\nodejs\bigfish\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (D:\nodejs\bigfish\node_modules\express\lib\router\index.js:315:13)
..
const express = require('express');
const Joi = require('joi');
const router = express.Router();
const HelperJoi = require('../helpers/joivalidation');
router.get('/GetRetailerDetails',VerifyToken, async (req,res) => {
//Start Validation Code
const schema = {
RetailerId: Joi.number().required(),
};
HelperJoi.validate(req,res,schema);
//End of Validation code
});
helpers 文件夹下的joivalidation.js
const Joi = require('joi');
//This is Helper Function Module for Joi Validation
function JoiValidation(req,res,schema){
const result = Joi.validate(req.query,schema, { abortEarly: false });
if(result.error){
//422 Validation Error
var objError = [];
Object.keys(result.error.details).forEach(function(key) {
objError.push(result.error.details[key]['message']);
});
return res.status(422).json({
'statuscode': 422,
'message': 'Validation Error',
'responsedata': objError
});
}
}
module.exports.validate = JoiValidation
解决方案
仅仅因为验证器函数在发生错误时返回响应并不意味着其余代码没有运行。
因此,您需要向中间件传达验证失败的信息,并且中间件不应继续。
例如:
// middleware
if (! HelperJoi.validate(req,res,schema)) {
// Validation failed, so we're done
return;
}
// validator function
if (result.error) {
...
res.status(422).json({
'statuscode': 422,
'message': 'Validation Error',
'responsedata': objError
});
return false;
}
return true;
另一种解决方案是验证器函数将在肯定验证的情况下返回“null”,在验证失败的情况下返回一组错误,并且中间件将返回 422 响应本身。这将解耦验证器功能。
推荐阅读
- aws-lambda - 将 Kinesis 流中的数据重新驱动到 Lambda 函数
- ckan - 我可以检查服务器正在使用的配置参数吗?
- java - 春季安全登录网址
- encryption - 保护 grpc Api 调用
- angular - 为什么组件无法读取角度和打字稿中服务返回的数据?
- python - ipykernel_launcher CPU 使用率高,没有 jupyter notebook 计算任何东西
- javascript - 如何在电子中使用 Material Web 组件
- scala - Intellij中scala的交互式调试控制台?
- javascript - 在等待休息调用的结果时显示等待/加载的 .jsp 页面或 .gif 图像
- neo4j - 具有聚合计数的 Neo4j 更新节点