使用 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 就可以了。
我正在构建一个聊天组件。该组件使用 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 就可以了。