Произошла ошибка после отправки запроса на функцию URL - PullRequest
1 голос
/ 09 мая 2019

Я установил функцию с одной пожарной базой для отправки сообщений моему боту. Но когда Firebase получает запрос, я вижу, что произошла какая-то ошибка.

FetchError: request to https://api.telegram.org/bot<BOT-TOKEN>/getMe failed, reason: getaddrinfo EAI_AGAIN api.telegram.org:443
    at ClientRequest.<anonymous> (/srv/node_modules/node-fetch/lib/index.js:1453:11)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:401:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:66:8)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)

и

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (/worker/node_modules/express/lib/response.js:767:10)
    at ServerResponse.contentType (/worker/node_modules/express/lib/response.js:595:15)
    at ServerResponse.sendStatus (/worker/node_modules/express/lib/response.js:357:8)
    at /srv/index.js:30:13
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

Но, пожалуй, один из них не влияет на результат.

В результате я не получаю никаких сообщений своему Боту.

Следующий скрипт, который я использую:

const functions = require('firebase-functions');
const telegraf = require('telegraf');
const axios = require('axios');

const bot = new telegraf('<BOT-TOKEN>')
bot.start((ctx) => ctx.reply('Welcome!'))
bot.help((ctx) => ctx.reply('Send me a sticker'))
bot.on('sticker', (ctx) => ctx.reply('?'))
bot.hears('hi', (ctx) => ctx.reply('Hey there'))
bot.launch()

exports.helloWorld = functions.https.onRequest((request, res) => {
    const token = '<BOT-TOKEN>';
    const url = `https://api.telegram.org/bot${token}/sendMessage`;
    axios.post(url, {
        chat_id: '154866113',
        text: "just do it!"
      })
      .then(function (response) {
        console.log(response);
        res.send({ status: "O"});
        return 'ok';
      })
      .catch(function (error) {
        console.log(error);
        res.sendStatus(500);
      });
    res.send("Hello from Firebase!");
});

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Ошибка getaddrinfo EAI_AGAIN означает, что вам необходимо переключиться на тарифный план "Flame" или "Blaze".

На самом деле, бесплатный план «Spark» «разрешает исходящие сетевые запросы только в сервисы, принадлежащие Google». См. https://firebase.google.com/pricing/ (наведите курсор мыши на знак вопроса, расположенный после заголовка «Облачные функции»)

Telegram API не является службой, принадлежащей Google, поэтому вам нужно переключиться на тарифный план "Flame" или "Blaze".

0 голосов
/ 09 мая 2019

Я предполагаю, что ответ на ошибку EAI_AGAIN связан с неверно сформированным URI.Вы уверены, что https://api.telegram.org/bot<BOT-TOKEN>/getMe является правильным URI и доступен из любого места, откуда запускается этот скрипт?

Вторая ошибка связана с тем, что вы вызываете метод res.send() более одного раза.Экспресс res объекты обертывают объект Node's ServerResponse, и как только соединение закрывается с помощью write или end, оно не может быть отправлено снова.Попробуйте удалить секцию res.send("Hello from Firebase!"); вашего кода и вернуться.

...