Я экспериментирую с созданием простого чат-бота Facebook Messenger, и у меня возникают проблемы с последовательной отправкой сообщений.
В приведенном выше примере он должен был напечатать по порядку «Hello!», «1», «2», «3». В настоящее время я слежу за документами Facebook, найденными здесь, чтобы реализовать эту простую функцию текстового сообщения. Я включил свой код сервера Express Node.JS ниже:
Определение функции sendTextMessage()
:
var request = require("request");
function sendTextMessage(user, text) {
messageData = {
text: text
};
request({
url: "https://graph.facebook.com/v2.6/me/messages",
qs: {access_token: PAGE_ACCESS_TOKEN},
method: "POST",
json: {
recipient: {id: user},
message: messageData
}
}, function(error, response, body) {
if (error) {
console.log("Error sending message: ", error);
} else if (response.body.error) {
console.log("Error: ", response.body.error);
} else {
console.log("Message successfully send.")
}
});
}
Используя его для отправки ответа:
sendTextMessage(user, "Hello!");
sendTextMessage(user, "1");
sendTextMessage(user, "2");
sendTextMessage(user, "3");
Я даже пробовал реализовать простую очередь, которая ставит сообщения в очередь и отправляет только одно сообщение за раз после каждого успешного обратного вызова request
. Это заставляет меня подозревать, что я неправильно взаимодействую с Messenger API.
Кто-нибудь сталкивался с этой проблемой? Как я могу получить сообщения для последовательной отправки? Спасибо!
ИЗМЕНИТЬ
Поскольку я реализовал простую очередь, но все еще испытываю эту проблему, я включаю сюда код для своей простой системы очередей.
var queue = [];
var queueProcessing = false;
function queueRequest(request) {
queue.push(request);
if (queueProcessing) {
return;
}
queueProcessing = true;
processQueue();
}
function processQueue() {
if (queue.length == 0) {
queueProcessing = false;
return;
}
var currentRequest = queue.shift();
request(currentRequest, function(error, response, body) {
if (error || response.body.error) {
console.log("Error sending messages!");
}
processQueue();
});
}
queueRequest(/* Message 1 */);
queueRequest(/* Message 2 */);
queueRequest(/* Message 3 */);
ОБНОВЛЕНИЕ
Об этой «ошибке» сообщили в Facebook, но похоже, что они не собираются ее исправлять. Пожалуйста, прочтите ветку тикетов в сообщении Facebook здесь, чтобы узнать, что они говорят о происходящем. (Спасибо Луизе за то, что привлекла к этому внимание Facebook)
setTimeout
в очереди сообщений. Работает, но вроде как взлом. Надеюсь, это поможет! - person Brian   schedule 25.07.2016