macOS Node.js nodebrewを使ったバージョンアップ

nodebrew install-binary

macOSで複数バージョンのNode.jsを使いたい場合「nodebrew」で管理すると簡単にNode.jsのバージョンを切り替えることが可能です。

brewのバージョンを確認しておく

brew -v

Homebrew 3.3.11」と返ってきたおそらく最新に近いバージョンだと思う

brew内でnode.jsのバージョンを管理できる「nodebrew」と云うパッケージがあるのでインストールする

brew install nodebrew

nodebrewがインストールされている場合は、そのnodebrewが古そうであればupgradeする

brew upgrade nodebrew

使いたいnode.jsのバージョンを確認

nodebrew ls-remote

ls-remoteで利用したいnode.jsのバージョンを確認する

nodebrew ls-remote 実行すると利用できるnodeバージョン一覧が表示される

v16.13.2があったのでそれをローカルmacOSに入れて使うことにする。

node.jsのバイナリをダウンロード

nodebrew install-binary v16.13.2

コマンドラインで「nodebrew install-binary バージョン」エンターするとnodebrewで指定したバージョンがインストールされる。

nodebrew list
先程install-binaryを実行した v16.13.2が入っている

この時点ではv16.13.2はダウンロードできたが利用できていない利用するには「nodebrew use」を実行する

nodebrew use v16.13.2

「nodebrew ls」を実行すると「current: v16.13.2」と表示されていればOK

npm update 更新方法

npm update

npmパッケージのアップデート

npm update

npm update」はnpmそのもののアップデートではなく中のパッケージ管理のアップデート

npm本体をアップデートするには

npm update npm

他にも

npm install -g npm@8.3.2

npm install -g 」の場合@バージョン番号を入れなくてもいいらしいです

Lambda Node.js MySQL接続でのUnknown application error occurred

PROTOCOL_SEQUENCE_TIMEOUT

AWS LambdaNode.js 12で関数を作成し、npm install mysqlを使ってMySQLデータベースに接続した場合、何度か実行していたらたまに「Internal Server Error」出ていましてLOGを見ると「Unknown application error occurred」と書いていました。

LOGを追っていくと下記のような「Quit inactivity timeout」を発見した。

2020-12-31T09:53:06.051Z	8d702d7b-XXXX-XXXX-99a1-XXXXX231d3ad	ERROR	Uncaught Exception 	{
    "errorType": "Error",
    "errorMessage": "Quit inactivity timeout",
    "code": "PROTOCOL_SEQUENCE_TIMEOUT",
    "fatal": true,
    "timeout": 30000,
    "stack": [
        "Error: Quit inactivity timeout",
        "    at Quit.<anonymous> (/var/task/node_modules/mysql/lib/protocol/Protocol.js:160:17)",
        "    at Quit.emit (events.js:314:20)",
        "    at Quit._onTimeout (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:124:8)",
        "    at Timer._onTimeout (/var/task/node_modules/mysql/lib/protocol/Timer.js:32:23)",
        "    at listOnTimeout (internal/timers.js:554:17)",
        "    at processTimers (internal/timers.js:497:7)"
    ]
}

原因は、MySQLとのコネクションを切るためのend()でした。

end(callback?: (err?: MysqlError) => void): void;
end(options: any, callback: (err?: MysqlError) => void): void;

上記のようになってるので、Promiseでラップした方がいいようでした。

const mysqlEnd  = () => {
	return new Promise((resolve, reject) => {
		try {
			mysqlのインスタンス.end({timeout: 3000}, (err) => {
				if (err) {
					console.log(err)
					reject(null)
				} else {
					resolve(null)
				}
			})
		} catch (_e1) {
			console.log(_e1)
		}
	})   
}

これで、いまのところ「Internal Server Error」は出ていません。たまにしか症状が出ないので確認が出来ていません。