node.js - molecularr-web API 网关。 onError 从未命中

标签 node.js api-gateway moleculer moleculer-web

我们使用来自 molecularr 网站的示例作为 API 网关的基础,并且当路由抛出错误时会遇到问题 - onError 处理程序永远不会被命中,异常未得到处理并且 Node 使应用程序崩溃。不是这个主意!

我意识到这不是一个完整的示例,但如果我们犯了任何严重的概念错误,或者如果我们应该期望 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

关于node.js - molecularr-web API 网关。 onError 从未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113056/

相关文章:

javascript - 浏览器化 "module is not defined"

javascript - 加载模块 node.js 的最佳方式

javascript - 对 xxHash 感到困惑

api-gateway - 如何在 KOGA 中设置 JWT 身份验证

docker - 获取使用 Docker Swarm 跨主机部署的微服务的指标

node.js - 在coffeescript中使用es6模块

python - 如何将路径参数转发到 VPC 链路端点?

nginx - Cloud Run 中的 API 和虚拟机中的 Nginx 反向代理

mysql - 从 Moleculer Framework 中的 mysql 数据库中的 find 方法获取选择字段

mysql - 如何在 Moleculer.js 中使用 Sequelize ORM 原始查询(内联或已经准备好的 SQL 查询)