如何包装javascript lambda处理程序函数?



我有几个用Javascript编写的lambda函数。有什么方法可以包装这些处理程序函数来执行一些常见的日志记录代码吗?

// handlers.js
export const emailHandler = (event, context, callback) => {
email();
}
export const loginHandler = (event, context, callback) => {
login();
}

像这样:

// genericHandler.js
export const genericHandler => (event, context, callback) => {
console.log('Event', event);
// How can I also make this work for login handler?
return emailHandler(event, context, callback) 
}

我认为这里的解决方案是将一些通用逻辑放在一个包/函数中,您可以在每个包/函数中使用。您不希望在一个 Lambda 函数中包含另一个函数的代码。您希望尽可能减小此代码大小,以便更快地启动冷启动。当然,如果你的代码很小,它不会有很大的区别,但它有点像在多个函数中对相同的代码进行反模式包,并让代码根据它的调用方式做一些不同的事情。

话虽如此,您始终可以在函数中包含多个入口点,然后传递一些内容以决定从那里调用什么,甚至传递要调用的函数。所以像这样:

export const emailHandler = (event, context, callback) => {
genericHandler(event, context, callback, email);
}
export const loginHandler = (event, context, callback) => {
genericHandler(event, context, callback, login);
}
export const genericHandler => (event, context, callback, function) => {
console.log('Event', event);
// How can I also make this work for login handler?
return function(event, context, callback) 
}
const email = (event, context, callback) => {
// email code
}
const login = (event, context, callback) => {
// login code
}

您可以将一个函数作为参数传递给 JS 中的另一个函数。 所以

// genericHandler.js
export const genericHandler => (called, event, context, callback) => {
console.log('Event', event);
// How can I also make this work for login handler?
return called(event, context, callback) 
}

然后将对登录手柄的调用替换为泛型处理程序。

genericHandler(emailHandler , event, context, callback);

更好的方法是为每个函数使用代理。退房 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

最新更新