在Javascript中导入时停止模块初始化
我正在处理一个通知包,在如何新建一个函数方面遇到了一些麻烦,而不仅仅是在导入函数时。例如: 我将此作为我的通知功能:在Javascript中导入时停止模块初始化,javascript,node.js,slack,Javascript,Node.js,Slack,我正在处理一个通知包,在如何新建一个函数方面遇到了一些麻烦,而不仅仅是在导入函数时。例如: 我将此作为我的通知功能: const sendNotification=async(选项:SendNotificationTypes)=>{ 常数handleChannel={ slack:async(选项:SlackNotificationTypes)=>{ 等待发送(选项); }, 电子邮件:异步(选项:EmailNotificationTypes)=>{ 等待发送电子邮件(选项); }, 短信:异步
const sendNotification=async(选项:SendNotificationTypes)=>{
常数handleChannel={
slack:async(选项:SlackNotificationTypes)=>{
等待发送(选项);
},
电子邮件:异步(选项:EmailNotificationTypes)=>{
等待发送电子邮件(选项);
},
短信:异步(选项:短信通知类型)=>{
等待发送短信(选项);
}
};
options.channels.forEach(通道=>{
交换机(通道){
机箱通道_松弛:
handleChannel.slack(选项.slack);
打破
案例频道(电邮:
handleChannel.email(options.email);
打破
案例频道\u短信:
handleChannel.sms(选项.sms);
打破
}
});
};
我的slack通知程序如下所示:
const slack=新的网络客户端(TokenGoesher)
const sendSlack=async(选项:SlackNotificationTypes)=>{
试一试{
等待slack.chat.postMessage({
频道:options.channel,
…(options.message&&{text:options.message}),
…(options.blocks&&{blocks:options.blocks}),
…(options.emoji&&{icon_emoji:options.emoji}),
…(选项、附件和{
附件:options.attachments
})
});
}捕获(错误){
抛出新错误(`Slack notification未能发送:${Error}`);
}
};
所以这很好,但是如果我的环境变量不在适当的位置,代码就会失败(因为我从process.env
中寻找slack标记)
相反,我希望能够在需要时实例化该函数,并在此时传入slack令牌。理想情况下,如果有一种方法可以避免每次发送通知时都需要一个新实例,那么我希望这样做
我被这个问题困扰了,我想我可能需要重构成一个类?欢迎任何意见 只是懒洋洋地初始化一个实例:
let slack = null; // token not yet available
async function sendSlack(options: SlackNotificationTypes) {
if (!slack) {
slack = new WebClient(tokenGoesHere) // hopefully available now
}
… // rest of the code using `slack` instance
}
但是,您的环境变量应该在流程启动时就已经存在,或者至少在使用它们的模块加载之前由
dotenv
之类的东西填充。使用process.env
的代码在哪里?@Bergi-它应该在const slack=new-WebClient(process.env.slack\u令牌)中
感谢您的快速响应!因此,如果我这样做,我会将令牌作为一个单独的参数传递(允许人们硬编码令牌或使用env值),这样就不会在每次跨代码的不同部分调用它时创建一个新实例?是的,确切地说,它只会在第一次调用sendSlack
时被初始化。但实际上,使用环境变量也应该与您的问题中的const
模式配合使用。太棒了,谢谢。我的强烈偏好是使用环境变量,但我需要提供一个选项,将令牌也作为字符串传递。