我正在处理一个与 chatGPT 集成到 Whatsapp 中的自动化程序。
每当我错过客户的电话,或者在其他情况下,我收到客户提供的电话号码的电子邮件,并且我引导他在 WhatsApp 上使用 chatGPT 协助发送至相应的号码时,就会触发该程序。或者在通常情况下,只要有人简单地通过向我的 WhatsApp 发送文本来开始聊天。
任何已发送到我的 Whatsapp 的消息都会触发监听器事件 client.on(message) (在代码中)。 现在的问题是,我不太明白nodeJS环境是如何工作的,我有一个想法,它是1个核心,但它可以以异步方式处理多个I/O。
如果我有多个客户同时连接到我的程序,则所有客户的全局变量在同一运行时是否相同,或者每个连接的客户在程序中都有自己的“环境”?
在这种情况下我必须使用线程吗?但我仍然对线程有一个想法,它们也共享内存
这是我的index.js:
//global variable
let protocol_number
let source
client.on("message", async (message) => {
// Check if the message is from the customer you want to converse with
console.log('protcol num on message: ',protocol_number,' message from: ',message.from)
const isCustomer = message.from === protocol_number; //check if same number whose initiated first chat
const customerMessage = message.body.trim().toLowerCase();
if (isCustomer && source ==='GMAIL') {
logger.info(`Incoming Message from Customer: ${message.from}: ${customerMessage}`);
// Use ChatGPT to generate a response based on the customer's message
const chatGptResponse = await AutoReplyAfterMissedCall(customerMessage);
// Send the response back to the customer
if (chatGptResponse) {
message.reply(chatGptResponse.trim());
}
} else if(isCustomer && source ==='GMAIL') {
logger.info(`Incoming Message from Customer: ${message.from}: ${customerMessage}`);
// Use ChatGPT to generate a response based on the customer's message
const chatGptResponse = await AutoReplyForGmail(customerMessage);
// Send the response back to the customer
if (chatGptResponse) {
message.reply(chatGptResponse.trim());
} else { //normal chat
const chatGptResponse = await normalGPTchat(customerMessage);
if (chatGptResponse) {
message.reply(chatGptResponse.trim());
}
}
}
});
注意:我没有使用数据库,也没有考虑使用数据库
在 Node.js 环境中,每个传入消息均由事件驱动的单线程模型处理。您提供的代码是“消息”事件的事件处理程序,并且它针对每个传入消息异步运行。
关于您对全局变量的担忧,在您提供的代码中,protocol_number和source被声明为全局变量。在 Node.js 环境中,这些变量将在所有客户端之间共享,因为 Node.js 是单线程的。如果您有多个客户同时连接,则不同的事件(消息)将同时访问和修改相同的变量。这可能会导致意外行为和数据损坏。
为了同时处理多个客户而不发生冲突,您应该避免对特定于客户的数据使用全局变量。相反,您应该在每个事件的上下文中维护与客户相关的信息,或者使用闭包为每个客户创建隔离的范围。考虑这样的事情,
// Event handler function
const handleMessage = (message, protocol_number, source) => {
//...enter the logic here
}
// Client event listener
client.on("message", async (message) => {
// Pass customer-specific data to the event handler
handleMessage(message, protocol_number, source)
})