是否有可能捕获 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();
}
};
}
我正在使用 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();
}
};
}