鱼鹰RAMLvalidationerror handling

我正在尝试自定义处理由于RAML规范失败发送给调用者的响应。 目前我的代码执行以下操作。

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)); } 

这个效果很好,但是当validation失败时发送给调用者的响应如下所示。

 { "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)" } 

这很好,但我不想把所有这些信息发送给调用者。 我只想在本地login,只发送{“code”:400,“message”:“input无效”}

我该如何让鱼鹰给我处理错误反应的能力?

我find了自己的问题的答案。 以防将来遇到任何人。

 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,我们正在接pipeerror handling,这对于标准化来说更好,最重要的是隐藏了正在使用RAML的事实。 将“notFoundHandler”设置为false意味着,未声明的路由将优雅地拒绝而不是随机的html。