Если вы хотите отправить файл как вложение, вы должны использовать: ctx.replyWithDocument
. Кроме того, ваша проблема: Как мне вернуть ответ от асинхронного вызова?
В этом конкретном случае вы можете использовать s3.getObject(params).promise()
, чтобы избежать API обратного вызова и легко использовать его в вашем bot.command
слушателе.
Используя async/await
(Node> = 7.6) ваш код может быть написан следующим образом
'use strict';
const Telegraf = require('telegraf');
const bot = new Telegraf('TOKEN');
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
accessKeyId: 'key',
secretAccessKey: 'secret'
});
const params = {
Bucket: 'myBucket',
Key: 'ipsum.txt'
};
bot.command('s', async ctx => { // Bot Command
try {
// If you're sending always the same file and it won't change
// too much, you can cache it to avoid the external call everytime
const data = await s3.getObject(params).promise();
ctx.reply('Check console'); // Message in Telegram
// This will send the file as an attachment
ctx.replyWithDocument({
source: data.Body,
filename: params.Key
});
// or just as text
ctx.reply(data.Body.toString());
} catch(e) {
// S3 failed
ctx.reply('Oops');
console.log(e);
}
});
const {
PORT = 3000
} = process.env;
bot.startWebhook('/', null, PORT);
Более подробную информацию о том, как работать с файлами, можно найти в telegraf docs
PS: Я проверил код, и он полностью работает: