使用 webhook 在 twilio 中触发 get 请求

use webhook to trigger a get request in twilio

我正在构建一个聊天组件。该组件使用 Redux。我的 Chat 组件有一个 useEffect 可以调度(listConversations())并检索对话及其消息。

当有人向我的聊天应用程序发送文本时,twilio 会自动使用新文本消息更新对话。问题是,为了让我在我的应用程序中看到消息,我必须点击刷新并执行一个 useEffect dispatch(listConversations()).

我认为我的解决方案是 webhook?

我在我的计算机上成功设置了 Ngrok,以创建一个 url 指向我的本地主机后端以进行开发。

http://ngrok.io ----> localhost:5000

我已经像这样成功地为我的对话创建了一个 webhook

 await subClient.conversations.services(convoServiceSid)
        .conversations(newConvoId)
        .webhooks
        .create({
           'configuration.method': 'GET',
           'configuration.filters': ['onMessageAdded', 'onConversationRemoved'],
           'configuration.url': ' http://3de1-a30-00-8547.ngrok.io/conversation-messages',
           target: 'webhook'
         })
        .then(webhook => console.log(webhook.sid));

我的想法是,这将触发对我的后端 /conversation-messages 的 'GET' 请求,这将触发我在下面的功能。但我不确定的是,如果 GET 来自 twilio,在这种情况下,响应会转到我的前端还是返回到 Webhook 服务器?

当我刷新我的页面时,下面的这个函数被调用,但是当我设置我的 webhook 时,它没有被调用。我做错了吗?

  const listConversationMessages = async (req, res) => {
        console.log("list conversation Messages triggered")
        console.log(req.body)
        const { subActServiceSid, subActAuthToken, convoServiceSid} = req.user
        const subClient = require('twilio')(subActServiceSid, subActAuthToken)
        const allConversationSids = []
        const allMessages = []
        const sortedMessages = []
        const options = { weekday: 'long'}
        const monthOptions = { month: 'long'}
       

        await subClient.conversations.services(convoServiceSid)
        .conversations
        .list()
        .then(conversations => conversations.forEach(c => allConversationSids.push(c.sid))); // conversation possibly has "read" property?
        await Promise.all(allConversationSids.map( async (convo) => {
           await subClient.conversations.services(convoServiceSid)
           .conversations(convo)
           .messages
           .list({limit: 20})
           .then(messages => messages.forEach(m => allMessages.push({"messagesId": m.conversationSid, "participantSid": m.participantSid,  "message": m.body, "time": { "day": new Intl.DateTimeFormat('en-US', options).format(m.dateCreated.getDay()), "hour": m.dateCreated.getHours() + ":" + m.dateCreated.getMinutes(), "date": new Intl.DateTimeFormat('en-US', monthOptions).format(m.dateCreated.getMonth()) + " " + m.dateCreated.getDate() + ", " + m.dateCreated.getFullYear()}})));
        }))
       let response
        if(allMessages.length < 1 ) {
        response = [{"messagesId": 1 , "content": [{ "participantSid": 2,  "message": "test"} ]}]
        } else {
        response = allMessages
    }
   
    result = await response.reduce(function (accumulator, indexOfObject) {
        accumulator[indexOfObject.messagesId] = accumulator[indexOfObject.messagesId] || [];
        accumulator[indexOfObject.messagesId].push(indexOfObject);       //it generates a new property a.messagesId with an array if it does not exist (the value of not existing properties is undefined). if exist, it assign itself
        return accumulator;
    }, Object.create({}));
  
    sortedMessages.push(result)
    const finalResult = Object.entries(sortedMessages[0]).map(([id, content]) => ({ id, content }))
    res.json(finalResult)
       }```

详情.... 我的问题是当我声明 webhook 'configuration.url: '// 我在 http://'

之前有一个 space

一旦我删除 space 就可以了。