20200703のNode.jsに関する記事は2件です。

【JavaScript 】Node.jsとは

はじめに

Node.jsとはサーバーサイドのjavascriptのプラットフォーム(実行環境)である。
javascriptは本来クライアントサイドで動作するプログラミング言語だが、Node.jsを使用することでサーバーサイドでもjavascriptが利用できるようになる。

公式サイト、またはOSのパッケージ管理ツールを使用してインストールすることでNode.jsが使用できる。
公式サイト
色々なパッケージ管理ツールでのインストール

クライアントサイドとサーバーサイド

? WEBページをブラウザで閲覧する場合の仕組み

1. ブラウザ(クライアント)でURLを指定、サーバーにリクエスト
2. リクエストを受けたサーバーはページを表示するために
   必要なhtmlやそれに関連するCSSやjavascriptをブラウザ(クライアント)に返す
3. クライアント側でそれらを受け取ることでWEBページが閲覧できるようになる

クライアントサイド
クライアントサイドの言語とは、クライアント(WEB上であればブラウザのこと)からサーバーにリクエストして得られた結果をブラウザで処理(表示)する際に使われる言語のこと。
javascriptがクライアントサイドの言語として挙げられる。

サーバーサイド
サーバーサイドの言語とは、クライアントに結果を渡すためにサーバー内で処理を行う言語のこと。
PHP、Ruby、Pythonなどの言語がサーバーサイドで使用される。

npm

npmとはNode.jsのパッケージを管理するツールで、Node.jsをインストールすることで自動的に使えるようになる。
ここでいうパッケージとは、あらかじめ用意されているNode.jsの便利な機能をまとめたもののこと。
npmで様々なパッケージのインストールやアップデートをコマンドラインから行うことができる。
npmでインストールされたパッケージはnode_modulesディレクトリにインストールされ、package.jsonファイルで管理ができる。

npmのインストールの種類

npmでパッケージをインストールするにはグローバルインストールローカルインストールの2種類の方法がある。

グローバルインストール
npmをインストールした場所にパッケージがインストールされる。全てのプロジェクト(フォルダ)でインストールしたパッケージが使用できるようになる。

↓下記コマンドを打ち込むことでグローバルにインストール

npm install -g パッケージ名

ローカルインストール
任意のプロジェクト(フォルダ)内にだけパーケージをインストールする。インストールしたプロジェクト内でしかパッケージが使用できない。

↓下記コマンドを打ち込むことでローカルにインストール

npm install パッケージ名

npm コマンド色々

npm install は npm i と省略して記述することもできる

* 作成したものを動かすために必要なパッケージをインストール
(package.json の dependenciesに追加される)
npm i -S

* 開発に必要なパッケージをインストール
(package.json の devDependenciesに追加される)
npm i -D

* パッケージのインストールリスト
npm list

* パッケージをアンインストール
npm rm

* node_modulesフォルダを削除
rm -rf node_modules
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CodeCommitにcommit/pushしたらLambda経由でSlackにcommentつき通知を飛ばす

AWS CodeCommit上で管理しているリポジトリに、誰かがcommit/pushしたらSlackで通知を受け取りたいと思って試行錯誤したときのメモになります。Lamda関数はNode.jsで記述しています。

スクリーンショット

screenshot.jpg

※ アイコンとCodeCommitの太字はSlack Incomming Webhookのカスタマイズで変更しています。

前置き

  • CodeCommitやLamda、Slackの細かい話は書きません。
  • Lamda関数のNode.jsのサンプルコードや注意点だけを書きます。
  • 以下はすべてAWS Console上からの操作です。

処理の流れ

CodeCommit → トリガー → Lambda → Slack Incomming WebhookのURLにPOST → Slackからスマホアプリ等に通知が飛ぶ

Lamda関数

適当な名前でLamda関数を作成します。以下のサンプルコードをindex.jsに上書きします。optionsのIncomming WebhookのURLと、中程にあるSlack上に表示するメッセージのBlock Kitテンプレートはお好みに合わせて修正します。

codeCommitToSlackWebhook
const AWS = require('aws-sdk');
const codecommit = new AWS.CodeCommit({
    region: 'ap-northeast-1'
});
const https = require('https');
//const util = require("util");
const options = {
    hostname: 'hooks.slack.com',
    path: '/services/*******/*******/*******',
    method: 'POST',
    headers: {
        "Accept" : "application/json",
        "Content-Type" : "application/json; charset=UTF-8"
    }
};

exports.handler = function(event, context) {
    let repository = event.Records[0].eventSourceARN.split(":")[5];
    let references = event.Records[0].codecommit.references;
    let funcArr = references.map((x) => {
        return new Promise((resolve,reject) => {
            let params = {
                commitId: x.commit,
                repositoryName: repository
            };
            codecommit.getCommit(params, function(err, data) {
                if (err) reject(err);
                else resolve({params:params,data:data});
            });
        });
    });
    Promise.all(funcArr)
        .then((values) => {
            //console.log(util.inspect({
            //  values:values
            //},{colors:true, depth: null}));
            return new Promise((resolve,reject) => {
                let blocks = [];
                blocks.push({
                    type: 'section',
                    text: {
                        type: 'mrkdwn',
                        text: `new commit pushed to \`${references[0].ref}\`\n\n*Repository:* "${repository}"`,
                    }
                });
                let v = values.map((x) => {
                    let tmp = new Date(x.data.commit.committer.date.split(' ')[0]*1000);
                    tmp = `${tmp.getFullYear()}/${('0'+(tmp.getMonth()+1)).slice(-2)}/${('0'+tmp.getDate()).slice(-2)} ${('0'+tmp.getHours()).slice(-2)}:${('0'+tmp.getMinutes()).slice(-2)}:${('0'+tmp.getSeconds()).slice(-2)}`;
                    return {
                        type: 'section',
                        fields: [
                            {
                                type: 'mrkdwn',
                                text: '*CommitId:*\n'+x.params.commitId
                            },
                            {
                                type: 'mrkdwn',
                                text: '*Comment:*\n'+x.data.commit.message
                            },
                            {
                                type: 'mrkdwn',
                                text: '*Committer:*\n'+x.data.commit.committer.name
                            },
                            {
                                type: 'mrkdwn',
                                text: '*When:*\n'+tmp
                            }
                        ]
                    };
                });
                values = {blocks:blocks.concat(v)};
                resolve(values);
            });
        }).then((value) => {
            //console.log(util.inspect({
            //  value:value
            //},{colors:true, depth: null}));
            let req = https.request(options, (res) => {
                let body = '';
                //console.log('statusCode: '+res.statusCode);
                res.setEncoding('utf8');
                res.on('data', (chunk) => {
                    body += chunk;
                });
                res.on('end',() => {
                    //console.log({body:body});
                    context.done(null,body);
                });
            });
            req.on('error',(e) => {
                //console.log({e:e});
                context.fail(e);
            });
            req.write(JSON.stringify(value));
            req.end();
        }).catch((err) => {
            //console.log({err:err});
            context.fail(err);
        });
};

Lambdaのアクセス権限

  1. Lambda アクセス権 → 実行ロール → IAMロールの設定が別ウィンドウで開く
  2. 「ポリシーをアタッチします」でAWSCodeCommitReadOnlyをアタッチ

Lambdaのトリガー

  1. Lambda 設定 → デザイナー → トリガーの追加
  2. トリガーの設定 → CodeCommitを選択
  3. リポジトリ名選択、トリガー名にslackWebhookTriggerなど入力、ブランチ名をすべてのブランチを選択
  4. 追加

通知のテスト

  1. CodeCommit リポジトリ選択
  2. 設定 → トリガー → slackWebhookTriggerなどトリガー名のリンク
  3. ページ下部 → トリガーのテスト

Lambdaの注意点

環境変数を設定しないと通知内容に含まれる時刻がUTCになってしまいます。以下を設定します。

  • Lambda 設定 → 環境変数 → キー: TZ、値: Asia/Tokyoを追加

デバッグ

Lambda関数内のconsole.logのコメントアウトを外し、CloudWatch Logsでどこでエラーが発生しているか確認します。

参考URL

例: AWS Lambda 関数の AWS CodeCommit トリガーを作成する
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-notify-lambda.html

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む