【前編】AWS LambdaでNode.jsを使いたい人のためのJavaScript入門【知識編】

こんにちは、エムティーアイ ヘルスケア部門 1年目エンジニアの最上です。この記事は、エムティーアイ Advent Calendar 2016 1日目の記事です。

今回は、AWS LambdaをNode.jsで書くために最低限知っておくべきことを書きたいと思います。Node.jsはサーバーサイドのJavaScriptなので、JavaScriptを知らないことには書けません。

そもそも、AWS Lambdaとは、何かしらのイベント(HTTPリクエストがあった、DBにデータが保存されたなど)に反応して、予め設定しておいたコードを実行させることができるサービスです。

この記事を読むにあたり、何かしらのプログラミング言語(HTML、CSSを除く)をそこそこ書けるくらいの知識が必要になります。ちなみに私の場合、Node.jsを触る前はC言語(5年)、Java(2年)、Swift(1年)みたいな状態でした。よって、何かしらのプログラミング言語が書けるけど初めてLambdaでNode.js触りますっていうわりとニッチな人向けの記事です。

この前編記事では、ある程度LambdaでのJSの書き方を知ることを目標にします。後編記事では、実践編として、JavaScriptを実際に書いてみたり、Lambdaの書き方を知れるようになっているのでこちらも合わせて御覧ください。

区切り

JSではセミコロン;で文の終わりを示します。しかし、なくても動いてしまいます、おそろしい。変なバグを起こさないためにも文末には;をつけましょう。

変数

宣言

JSでは宣言時に型を決める必要がありません。varで宣言します。

var test;
var test1, test2, test3;

JSでは下記の型が存在します。

  • boolean
  • number
  • string
  • object
  • array
  • function

boolean

true, falseが使えます。

number

整数、浮動小数点数が扱える。型の推論を処理系が勝手にやってくれるのでこちらが明示的に示す必要はありません。

var n = 1;
var f = 0.1;

四則演算は、通常通り「+ - * /」で行えます。

string

文字列の宣言には、" ' の2種類が使えます。実はこの2つには違いがありませんので、どちらを使っていただいても大丈夫ですが、できるだけ統一したほうが見た目がきれいかと。str5は、"と'を入れ子にするとエスケープ不要になるので、非常に便利です。

var str1 = "文字列1"; // どっちでもいっしょ
var str2 = '文字列2'; // どっちでもいっしょ
var str3 = str1 + str2; // 文字列の連結
console.log(str3); // 文字列1文字列2
var str4 = "私は\"最上\"だ"; // 私は"最上"だ
var str5 = '私は"最上"だ'; // 私は"最上"だ  "と'を入れ子にするとエスケープ不要
console.log(str1.length); // 4

object

JSONを扱う際に使うことが多く、Lambdaでは必須です。JSONとは、JavaScript Object Notationの略なので、JSのObjectが元になっているようです(ルールがちょっと違う)。

// 宣言
var obj = {
    "name": "最上",
    age: 24, // JavaScriptとしてはインデックス名は""なしでもOKだが、.jsonファイルとして保存したりする場合は文法エラー。
    "weights": [
        {
            "date": "2016/11/27",
            "weight": 60
        },
        {
            "date": "2016/11/28",
            "weight": 59.5
        }
    ]
};
// 取り出し方
console.log(obj.name); // 最上
console.log(obj["name"]); // これでも 最上 が取り出せる
console.log(obj.age); // 24(Number)
console.log(obj.weights[0].date); // 2016/11/27
console.log(obj.height) // そんな要素はないのでundefinedとなる

array

JSでももちろんですが配列が扱えます。配列はかなり自由で、型の縛りがありません。コンパイルエラーがないためちゃんと決まりを持って使わないと辛いです。

var array = [10, "最上", 20];
console.log(array[0]); // 10
console.log(array[1]); // 最上

要素の追加や削除も可能ですが、たくさんあるので今回は割愛します。

関数(function)

宣言

JavaScriptでは関数を変数に代入できたりしますが、個人的にはあまり使わない(とか言ってLambdaで必ず1回は使うけど、おまじないてきに逃げられる)のでそれは割愛。普通に宣言すればよくみる関数ですね。戻り値も引数も型を決めません。

function add(arg1, arg2){
  var sum = arg1 + arg2;
  return sum;
}
console.log(add(1,2)); // 3

アロー関数

たまに出てくるし、Lambdaの初期コードにも使われているので一応。こういう書き方もできますよくらいでOKです。

// 上のadd()と同じ
(arg1, arg2) => {
  var sum = arg1 + arg2;
  return sum;
}

コールバック関数

引数に関数が渡された関数をコールバック関数というそうです。Node.jsでは主に、その関数の処理が終了したら呼ばれる関数というイメージです(個人的に)。特に、Node.jsでは非同期処理を行うため、このコールバック関数の理解が必須です。

// 例:paramに応じて何かをする関数
// 引数の関数は、asyncFunctionの処理が終了したら呼ばれる
// その際に、処理にまつわる情報をerror,data(関数によって必要な引数や順番は異なる)に入れておいてくれる
asyncFunction(param, function(error, data){
  console.log(error); // なんらかのエラー情報
  console.log(data); // 非同期でなんか取ってきてくれたデータ
});

条件文

普通にifやforやwhileなどが使えます。全然特殊ではないので簡単な説明は割愛。ここでは前述のコールバック関数と合わせてよくやる書き方を紹介します。

JavaScriptでは下記値もfalseとみなされます。

  • null
  • undefined
  • 空文字列
  • 数値の0
  • NaN

これを利用して下記のような書き方をよくします。コールバック関数のerrorにはエラーであれば何かが格納されますが、エラーでなければundefinedやnullなどのfalse値とみなされる値が格納されます。

asyncFunction(param, function(error, data){
  if(error){
    // errorの場合の処理
  }else{
    // 正常にdataが取得できた場合の処理
  }
});

まとめ

AWS LambdaをNode.jsで利用するにあたって、必要最低限なJavaScriptの知識を説明したつもりです。不足している部分があることに気づいたら追記していきたいと思います。

続きは後編記事で!

おわり。