Amazon Lambda - возврат файла docx - Node.js - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь перенести приложение Node.js из Облачные функции Google в Amazon Lambda .Приложение загружает файл docx из Amazon S3, обрабатывает его и возвращает этот файл docx.Однако я застрял в процессе возврата файла.В Google Cloud Platform я мог сделать это:

module.exports = function(customENV){ return function(req, res) {
    new AWS.S3().getObject({ Bucket: aws_bucket, Key: aws_file }, function(err, data) {
        if(!err) { 
            res.set('Access-Control-Allow-Origin', "*");
            res.set('Access-Control-Allow-Methods', 'GET, POST');
            res.set('Content-Disposition', `inline; filename="rename.docx"`);

            res.type('docx');
            res.status(200);

            res.end(data.Body, 'binary');
        }
    });
}};

В Amazon Lambda я повторил решение следующим образом:

exports.handler = function(event, context, callback) {
    new AWS.S3().getObject({ Bucket: aws_bucket, Key: aws_file }, function(err, data) {
        if(!err) {
            var response = {
                statusCode: 200,
                headers: {
                    'Access-Control-Allow-Origin': "*",
                    'Access-Control-Allow-Methods': 'GET, POST',
                    'Content-type' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                    'Content-Disposition': 'inline; filename="rename.docx"'
                },
                isBase64Encoded: true,
                body: data.Body,
            };

            callback(null, response);
        }
    });
};

В качестве шлюза API я использовал LAMBDA_PROXY с ЛЮБЫМ методом.Модели / ответы / отображения все по умолчанию.Однако единственный ответ, который я получаю, это «Внутренняя ошибка сервера».В журналах CloudWatch я также вижу «Выполнение не удалось из-за ошибки конфигурации: Невозможно base64 декодировать тело».

Я попытался тиражировать различные решения и / или различные конфигурации API-шлюза, но безуспешно.Возможно, я просто не понимаю API-шлюз Amazon и поэтому не знаю, как правильно его настроить.

Возможно, как говорит журнал, это может быть и преобразование данных, но я пробовал преобразования, такие как toString ("base64") , также безуспешно.

Любые идеи, что я долженсделать, чтобы это минимальное решение работало?Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Ваше решение должно работать, если вы измените свой ответ на:

        var response = {
            statusCode: 200,
            headers: {
                'Access-Control-Allow-Origin': "*",
                'Access-Control-Allow-Methods': 'GET, POST',
                'Content-type' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                'Content-Disposition': 'inline; filename="rename.docx"'
            },
            isBase64Encoded: true,
            body: Buffer.from(data.Body).toString('base64'),
        };

Это должно преодолеть вашу ошибку Unable to base64 decode the body (если это не так, пожалуйста, зарегистрируйте объект response, чтобы подтвердить, что ваша лямбда успешно возвращается и тело равно строке base64) .

Однако вам также необходимо добавить двоичный тип носителя в ваше развертывание шлюза, иначе, когда вы сделаете запрос, ваш ответ будет строкой base64, а не двоичным. Здесь задействовано несколько кликов ( полная документация ):

  • Под выбранным API на основной навигационной панели выберите Настройки.
  • На панели «Параметры» выберите «Добавить тип двоичного носителя» в разделе «Типы двоичного носителя».
  • Введите требуемый тип мультимедиа, например, image / png, в поле ввода текста. При необходимости повторите этот шаг, чтобы добавить больше типов носителей.
...