JavaScript 配列をJSONに変換する

JavaScript Array To JSON

JavaScriptで不定長の配列変数の情報をJSON化するコードです。入力は、[“ドラゴン”, “ライガー”, “ポセイドン”]という配列を入れています。この配列は3つ固定ではなく何個セットしても大丈夫です。DynamoDBなどでExpressionAttributeValuesを設定する場合などに使えそうです。

const arrayToJSON = async(values) => {
    const columnName = ":ColumnName"
    let s = {}
    let i = 0
    values.forEach(aValue => {
        let element1 = columnName + String(++i)
        s[element1] = aValue
    })
    return {"ExpressionAttributeValues":s}
}
Promise.all([arrayToJSON(["ドラゴン", "ライガー", "ポセイドン"])]).then(prmsArr => {
    prmsArr.forEach(jValue => {
        console.log(JSON.stringify(jValue))
        //{"ExpressionAttributeValues":{":ColumnName1":"ドラゴン",":ColumnName2":"ライガー",":ColumnName3":"ポセイドン"}}
    })
})

AWS lambda zipファイルアップロード

AWSlambda zipアップロード

AWS lambdaはサーバーレスで関数処理を実行したい場合便利なサービスです。初めて試す場合シンプルにブラウザからコードを記述しテスト実行まで行えます。lambda関数をNode.js 12.xの設定で作成した場合初期のコードは下記のサンプル(index.js)が入っています。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

index.jsに入る範囲でコードを書く分には、ブラウザの機能を使って書いてもいいとは思うのですが、複数のJSファイルで構成したい場合やnode_modulesを埋め込みたい場合ブラウザから手動で登録していくのは大変な作業です。このような場合lambdaには.zipファイルでのアップロードとS3からのファイルアップロードが利用できます。私の場合ローカル環境でテストしてzipファイルにまとめてlambdaへアップロードする方法を採用しています。ローカル環境でプログラムに必要なnode_modulesを先に入れてしまいます。そして、メイン実行するJSファイルをサンプルと同じくindex.jsという名前にしてexports.handlerに返す処理を埋め込みます。自分で作成したクラスモジュールなども別のJSファイルに入れます。その後下記コマンドでzipを実行します。

#プロジェクト内のディレクトリの場合
zip -r index.zip ./*

zipコマンドは-rオプションをつけるだけです。index.zipが完成したらブラウザ画面の[関数コード]のアクション内「.zip ファイルをアップロード」を選択します。

「.zip ファイルをアップロード」を選択
「.zip ファイルをアップロード」を選択

ファイルアップロードダイアログが表示されるのでアップロードさせるzipファイルを選択し[保存]ボタンを押します。アップロードが成功するとブラウザの関数コード編集が出来なくなるようです。

.zip ファイルをアップロードダイアログ
.zip ファイルをアップロードダイアログ

Node.jsで時刻(Date)を使う

[Node.jsで時刻表示]()

console.log(new Date());
// または
console.log(new Date(Date.now() ) );

> Fri Dec 14 2018 14:40:40 GMT+0900 (JST) {}

上記のように表示されます。

文字列からDate変換

この表示された文字列を「{}」部分だけ外すとDate.parse()できます。

let t = new Date(Date.parse(“Fri Dec 14 2018 14:40:40 GMT+0900 (JST) {}”.replace(‘{}’, )) );
console.log(t);

//こんな文字フォーマットでも可能です
let t1 = new Date(Date.parse(‘2018-12-14T00:00:31.6410000+00:00’));
//+00:00設定したので、日本時間表示では
//t1 = Fri Dec 14 2018 09:00:31 GMT+0900 (JST) こうなります。

Dateの演算

3日後や、1ヶ月後など計算したい場合

let t2 = new Date(Date.now()); //現在時刻取得
t2.setHours(t2.getHours() + 2); //2時間後の
t2.setDate(t2.getDate() – 3); //3日前の
t2.setMinutes(t2.getMinutes() + 10); // 10分後
console.log(‘t2 = ‘ + t1);

t2 = Wed Dec 12 2018 00:07:16 GMT+0900 (JST)

aws lambda Node.js 8.10の場合

日本時間のクリスマス '2018-12-25T00:00:00.0000000+09:00'を表示すると

“2018-12-24T15:00:00.000Z”

aws lambdaがUTCなので、24日になってしまいます。