是否有可能捕获 Twilio webhook 错误以将它们记录在 NodeJS 中

Is it possible to catch Twilio webhook error to log them in NodeJS

我正在使用 Twilio 和 NodeJS 开发一个项目。 我设置了一个 twilio.webhook() 并且作为一项要求,我需要在出现错误时捕获并记录它。

例如,如果 webhook 因 403 Forbidden 而失败,我应该能够捕获它并在控制台中记录有关它的错误。

我在网上找不到方法,我在这里阅读了 Twilio 文档 Twilio doc

我制作了一个验证实用程序,以便能够在多个地方验证 Twilio,但无法记录重要的地方

const validate = (req, res, next) => {
  log.info('Twilio Access Validation');

    const { NODE_ENV } = process.env;
    const { authToken } = config.get('twilio');

    const shouldValidate = NODE_ENV !== 'development';

    const validateTwilio = twilio.webhook({ validate: true }, 'authToken');

    router.use(validateTwilio);
};

此处为 Twilio 开发人员布道师。

您无法使用 webhook 函数挂钩验证失败,但您可以编写自己的中间件函数,从 webhook function.

中获取灵感

类似这样的方法可能有效:

const { validateExpressRequest } = require("twilio");

function webhook() {
  var opts = {
    validate: true,
  };

  // Process arguments
  var tokenString;
  for (var i = 0, l = arguments.length; i < l; i++) {
    var arg = arguments[i];
    if (typeof arg === 'string') {
      tokenString = arg;
    } else {
      opts = _.extend(opts, arg);
    }
  }

  // set auth token from input or environment variable
  opts.authToken = tokenString ? tokenString : process.env.TWILIO_AUTH_TOKEN;

  // Create middleware function
  return function hook(request, response, next) {
    // Do validation if requested
    if (opts.validate) {
      // Check if the 'X-Twilio-Signature' header exists or not
      if (!request.header('X-Twilio-Signature')) {
        
        // Log error here

        return response.type('text/plain')
          .status(400)
          .send('No signature header error - X-Twilio-Signature header does not exist, maybe this request is not coming from Twilio.');
      }
      // Check for a valid auth token
      if (!opts.authToken) {

        // Log error here

        console.error('[Twilio]: Error - Twilio auth token is required for webhook request validation.');
        response.type('text/plain')
          .status(500)
          .send('Webhook Error - we attempted to validate this request without first configuring our auth token.');
      } else {
        // Check that the request originated from Twilio
        var valid = validateExpressRequest(request, opts.authToken, {
          url: opts.url,
          host: opts.host,
          protocol: opts.protocol,
        });

        if (valid) {
          next();
        } else {
 
          // Log error here

          return response
            .type('text/plain')
            .status(403)
            .send('Twilio Request Validation Failed.');
        }
      }
    } else {
      next();
    }
  };
}