Ошибка: невозможно установить заголовки после их отправки в промежуточное ПО для проверки joi - PullRequest
0 голосов
/ 06 октября 2018

Я создал одно промежуточное программное обеспечение для обработки ошибок валидации 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      
});

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

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

HelperJoi.validate - это функция, внутри которой вы отправляете ответ, а затем возвращаетесь к вызывающей функции, которая является обработчиком маршрута, и выражают попытку завершить реквизит и установить заголовки, которые уже отправлены.Либо используйте проверку в качестве промежуточного программного обеспечения, либо возвращайте ошибки проверки из HelperJoi.validate и отвечайте от обработчика маршрута.

0 голосов
/ 06 октября 2018

Похоже, что ваша реализация неверна.

Пример: Как реализовать JOI проверка

const express = require('express');
const router = express.Router();
const joiHelper = require('../helpers/joiHelper');
router.get('/GetRetailerDetails',VerifyToken, async (req,res) => {

   let validationResult = joiHelper.JoiValidation(req.query, joiHelper.getRetailSchema(), {allowUnknown: false});
    if (validationResult.error) {
      return res.status(422).json({
            'statuscode': 422,
            'message': 'Validation Error',
            'responsedata': joiHelper.parseError(validationResult.error.details)
        });
    }    

    //Proceeds your get request
});

joiHelper.js

const Joi = require('joi');

const joiHelper = {};

joiHelper.JoiValidation(object, schema, options = {}){
    return Joi.validate(object, schema, options);
};

joiHelper.parseError(errorObject) {
    let errorDetail = [];
    for (var key in errorObject) {
      errorDetail.push(errorObject[key].message);
    }
    return errorDetail.join(', ').replace(new RegExp('"','g'),'');
}
joiHelper.getRetailSchema () {
  const schemaObj = {
    RetailerId: Joi.number().required()
  };
  return Joi.object().keys(schemaObj);
};

module.exports = joiHelper;
0 голосов
/ 06 октября 2018

То, что функция валидатора возвращает ответ в случае ошибок, не означает, что остальная часть кода не выполняется.

Так что вам необходимо сообщить промежуточному программному обеспечению, что проверка не удаласьи промежуточное программное обеспечение не должно продолжаться.

Например:

// 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;

Другое решение состоит в том, что функция валидатора будет либо возвращать «ноль» в случае положительной проверки, и массивошибок в случае неудачной проверки, и промежуточное программное обеспечение вернет сам ответ 422.Это развязало бы функцию валидатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...