Как правильно вернуться к лямбда-функции AWS в Node.js? - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в AWS Lambda, и есть одна вещь, которая меня очень смущает.

До сих пор я нашел следующие варианты возврата из функции в Node.js:

1.

exports.handler = (event, context) => {
    context.succeed('ok');
}

2.

exports.handler = (event, context) => {
    context.done(null, 'ok');
}

3.

exports.handler = (event, context, callback) => {
    callback(null, 'ok');
}

4.

exports.handler = async event => {
    return "ok";
}

Чем они отличаются?Какие-либо функциональные или эксплуатационные различия?

Кто-нибудь может объяснить, как завершить функцию правильным способом ?

1 Ответ

0 голосов
/ 11 февраля 2019

Возможно, вы используете Node.js 8.10, который до сих пор является последней версией Node.js, поддерживаемой AWS Lambda, в противном случае последний (4.) фрагмент кода вообще не будет работать (из-за синтаксической ошибки).

В Node.js 8.10 все перечисленные выше варианты действительны, большинство из них все еще существуют только для совместимости с более ранними версиями времени выполнения.

Первые два (1. и 2.)самые старые, и не рекомендуется больше их использовать.Функция done(err?, res?) эквивалентна добавленной позже callback(err?, res?), которая часто использовалась до Node.js 8.10, и вы можете найти множество примеров кода даже в официальной документации.Это типичный обратный вызов и может использоваться в асинхронной обработке:

exports.handler = (event, context, callback) => {
    var params = {
        Bucket: "examplebucket", 
        Key: "HappyFace.jpg"
    };
    s3.getObject(params, function(err, data) {
        if (err) return callback(err);
        callback(null, data);
    });    
}

Тем не менее, эта функция имеет все недостатки использования обратных вызовов в целом (Callback Hell).

Up Node.js 8.10Вы можете использовать Promises вместе с async/await синтаксическим сахаром, что делает асинхронные вычисления похожими на синхронные.AWS JavaScript SDK добавил функцию promise() почти ко всем функциям, ранее использовавшим обратные вызовы.Теперь вы можете написать:

exports.handler = async event => {
    var params = {
        Bucket: "examplebucket", 
        Key: "HappyFace.jpg"
    };
    var data = await s3.getObject(params).promise();
    // here you process the already resolved data...
    return data;

    // or you can omit `await` here whatsoever:
    // return s3.getObject(params).promise();
}

, который производит более короткий и элегантный код, более читабельный для людей.

Конечно, в конце вы можете выбрать то, что вам нравится, просто сравните ваши примеры фрагментов...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...