簡體   English   中英

分子網絡 API 網關。 onError 從未命中

[英]moleculer-web API gateway. onError never hit

我們使用來自分子網站的示例作為我們 API 網關的基礎,並且在路由拋出錯誤時遇到問題 - onError處理程序從未被命中,異常未得到處理並且節點使應用程序崩潰。 不是這個主意!

我意識到這不是一個完整的例子,但是如果我們犯了任何嚴重的概念錯誤,或者我們應該期望onError處理程序被命中會很好......

const OpenApiMixin = require('./openapi.mixin')
const { MoleculerError } = require('moleculer').Errors

class BadRequestError extends MoleculerError {
  constructor (message) {
    message = message || 'Bad request'
    super(message, 400, 'Bad request')
  }
}

...
const functionThatCanThrowError = async (req, res)=>{
    if (!req.body.email) {
      throw new BadRequestError('No email transferred.')
    }
    ...
}

module.exports = {
  name: 'api-gateway',
  mixins: [ApiGateway, OpenApiMixin()],
  settings: {
    ...
    path: '/',
    routes: [
    {
      path: '/api',
      ...
      aliases: {
            'POST /route-can-throw-error': functionThatCanThrowError
      },

      // Route error handler
      onError (req, res, err) {
        let { type, code, message, data, name } = err
        res.writeHead(Number(code) || 500, { 'Content-Type': 'application/json' })
        res.end(JSON.stringify({ type, code, message, data, name }))
      }
    }
 ]
}``

定義的functionThatCanThrowError是一個中間件。 它應該是一個類似 Express 的中間件,您不能在其中拋出錯誤。 為此,您應該調用next(err)

例如:

const functionThatCanThrowError = async (req, res, next)=>{
    if (!req.body.email) {
      next(new BadRequestError('No email transferred.'))
    }
    ...
}

更多信息: https : //expressjs.com/en/guide/error-handling.html

@icebob 所說的 + 一個例子


    module.exports = {
        name: "api",
        mixins: [ApiGateway],
        settings: {
            port: process.env.PORT || 3000,
            routes: [
                {
                    path: "/api",

                    whitelist: ["**"],

                    aliases: {
                        "GET /req-res-error": [
                            (req, res, next) => {
                                next(new MoleculerError("Req-Res Error"));
                            }
                        ],
                        "GET /action-error": "api.actionError"
                    },

                    onError(req, res, err) {
                        this.logger.error("An Error Occurred!");
                        res.end("Global error: " + err.message);
                    }
                }
            ]
        },

        actions: {
            async actionError() {
                throw new MoleculerError("ACTION ERROR");
            }
        }
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM