задача сельдерея всегда возвращает null в Node
У меня есть программа JavaScript, использующая node-celery, модуль, который вызывает задачу сельдерея и получает результат. Я пытаюсь начать с простого, получив результат от задачи «добавить» сельдерей. Я следую точному демонстрационному коду из документации и по-прежнему не получаю никаких результатов (см. Документацию по этой ссылке: https://github.com/mher/node-celery (см. Первый пример в разделе «backends»))
Код сельдерея:
@app.task(base=QueueOnce)
def add(x, y):
return x + y
JavaScript
client = celery.createClient({
CELERY_BROKER_URL: "redis://myurl.com:0000/0",
CELERY_RESULT_BACKEND: "redis://myurl.com:0000/0"
});
client.on('connect', function() { //on successful conncection to the celery server
console.log(client.ready); //outputs 'true' meaning my code is connecting to the celery server properly
var result = client.call('tasks.add', [1, 2]); //call the 'add' task (shown above) with args as 1 and 2
setTimeout(function() {
result.get(function(data) { //when task returns result. . .
console.log(data); //output result; data will be null if the task is not finished by timeout
});
}, 10000); //time to time out if celery is taking too long (should not take anywhere near this long)
});
Моя проблема в том, что
console.log(data);
всегда возвращает null, что означает, что мой JS никогда не получает ответа от сельдерея.
Это действительно странное поведение, предполагающее, что я следую точному примеру в документации, и я также подтвердил, что он правильно подключает сервер сельдерея, не только используя
console.log(client.ready);
в моем коде, но я также попытался изменить
CELERY_BROKER_URL
а также
CELERY_RESULT_BACKEND
на разные значения, которые привели к сбою соединения. Я также установил максимальное время ожидания, и он по-прежнему возвращает значение null, поэтому это не проблема с тайм-аутом.
В чем может быть проблема?
1 ответ
Это своего рода выстрел в темноте, так как я ничего не знаю о сельдерее, но, судя по его виду, кажется, что именно так вы можете захотеть структурировать свой код в первую очередь.
client.on('connect', function() {
console.log(client.ready);
var result = client.call('tasks.add', [1, 2]);
var timeout = setTimeout(function() {
throw new Error("Timeout");
}, 10000);
result.get(function(data) {
clearTimeout(timeout);
console.log(data);
});
)
т.е. немедленно ждать получения данных после выполнения задачи и запускать тайм-аут только в том случае, если ответ не получен в течение заданного промежутка времени.
Имеет ли это смысл, или я здесь совершенно не в теме?