Osprey RAML Error Checker

I am trying to customize the handle response sent to the caller due to a failure of the RAML specification. At the moment, my code does the following.

const cfg = require("./cfg");
const log = require('./logging');
const RAML = require('osprey');
const startMessage = "My Service started on port " + cfg.SERVER_PORT + " at " + cfg.API_MOUNT_POINT;

// start an express server
const start = x => {
  // server dependencies
  const fs = require('fs'),
  express = require('express'),
  app = express(),
  router = express.Router(),
  bodyParser = require('body-parser'),
  api = require('./api');

  RAML.loadFile(cfg.API_SPEC).then(_raml => {

    app.use(bodyParser.json({ extended: true }));
    // hide the useless "powered by express" header
    app.disable('x-powered-by');
    // RAML validation
    app.use(cfg.API_MOUNT_POINT, _raml);
    app.use(cfg.API_MOUNT_POINT, api);
  })
  .then(v => {
    app.listen(cfg.SERVER_PORT, function() {
        log.info(startMessage);
    });
  })
  .catch(e => log.error(e));
}

This works well, but the response sent to the caller on a failed check is shown below.

{
  "errors": [
    {
      "type": "json",
      "dataPath": "redeemtype",
      "keyword": "required",
      "schema": true,
      "message": "Missing required property: redeemtype"
    }
  ],
  "stack": "BadRequestError: Request failed to validate against RAML definition\n    at createValidationError (/Volumes/Devel/dollardine/node_modules/osprey-method-handler/osprey-method-handler.js:735:14)\n    at ospreyJsonBody (/Volumes/Devel/dollardine/node_modules/osprey-method-handler/osprey-method-handler.js:448:21)\n    at handle (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:56:16)\n    at dispatch (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:39:20)\n    at next (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:37:24)\n    at jsonParser (/Volumes/Devel/dollardine/node_modules/body-parser/lib/types/json.js:94:7)\n    at handle (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:56:16)\n    at dispatch (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:39:20)\n    at middleware (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:41:16)\n    at /Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:10:16\n    at ospreyContentType (/Volumes/Devel/dollardine/node_modules/osprey-method-handler/osprey-method-handler.js:325:17)\n    at handle (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:56:16)\n    at dispatch (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:39:20)\n    at next (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:37:24)\n    at ospreyMethodHeader (/Volumes/Devel/dollardine/node_modules/osprey-method-handler/osprey-method-handler.js:262:12)\n    at handle (/Volumes/Devel/dollardine/node_modules/compose-middleware/lib/index.js:56:16)"
}

This is great, but I do not want to send this information to the caller. I just want to register it locally and just send {"code": 400, "message": "Invalid input"}

How to get osprey to give me the ability to handle an error response?

+4
source share
1 answer

I found the answer to my question. If someone is stuck here in the future.

const start = x => {
  // server dependencies
  const fs = require('fs'),
  express = require('express'),
  app = express(),
  router = express.Router(),
  bodyParser = require('body-parser'),
    api = require('./api');

  const ramlConfig = {
    "server": {
      "notFoundHandler": false
    },
    "disableErrorInterception": true
  }

  osprey.loadFile(cfg.API_SPEC, ramlConfig).then(_raml => {

    app.use(bodyParser.json({ extended: true }));
    // hide the useless "powered by express" header
    app.disable('x-powered-by');
    // RAML validation
    app.use(cfg.API_MOUNT_POINT, _raml);
    app.use(customNotFoundHandler);
    app.use(ramlErrorChecker);


    app.use(cfg.API_MOUNT_POINT, api);
    //app.use(ramlErrorChecker);
  })
  .then(v => {
    app.listen(cfg.SERVER_PORT, function() {
        log.info(startMessage);
    });
  })
  .catch(e => log.error(e));
}

const ramlErrorChecker = (err, req, res, next) => {
  if (err) {
    log.error("RAML validation failed. Reason: " + err);
    res.status(400);
    return res.json(buildResponseJSON(400));
  }
  return next();
}

const customNotFoundHandler = (req, res, next) => {
  // Check for existence of the method handler.
  if (req.resourcePath) {
    return next()
  }
  res.status(404);
  return res.json({"message": "The path is not found"});
}

ramlConfig, . "disableErrorInterception" true, , , , , RAML . "notFoundHandler" false , html.

+1

Source: https://habr.com/ru/post/1673254/


All Articles