【Node.js】AWS LambdaからMySQL(AWS RDS）のレコードの個数を取得

<p>
Node.jsで、AWS RDS（MySQL）のレコードの個数を取得するのに結構ハマったので、ここに記します。



##環境・システム構成
・node.js v14.5.0
・AWS Lambda　から AWS RDS(MySQL)の情報を取得
<img src="https://i.gyazo.com/8fe5df6b9910029b6b1c4ef9f8bb652b.png" width=60%>



##方法
<p>
SQL文でテーブルの中の数を取得するとき、
たとえば、 テーブル users の中の カラム userIDの数 を取得するには、以下のSQL文になります。

```
SELECT COUNT(*) from users where userId ='userID';
```

これを、Lambda内にnode.jsで書くと

```JS:index.js
'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(rows);        
    });
}
```

rowsに数が格納されているはずですが、
コンソールには

```
[ [RowDataPacket] ]
```
<p>
なんか、よくわからないので、

```JS
console.log(rows[0]);
```
とすると


```
RowDataPacket { 'COUNT(*)': 1 }
```
<p>
この'COUNT(*)'の値を取得しようと普通に考えると、

```JS
console.log(rows[0].RowDataPacket.COUNT(*));
```
ですが、これでは文法エラーになります。

```
SyntaxError: Unexpected token '*'
```

<p>
どうすればいいんだ。

SQL文の　COUNT(*) の後ろに <B>As count</B> を入れたらいいです。

```JS
SELECT COUNT(*) AS count from users where userId ='userID';
```

お、なんかいい感じになってきました。

```
RowDataPacket { count: 1 }
```
<p>
しかし、実はこれは、JSONっぽいですが、JSONではありません。
RowDataPacketと出たときは、
<B>JSON.stringify()</B>で、
JSONに変換する必要があります。

```JS
console.log(JSON.stringify(rows[0]));
```
<p>
お、 いい感じ。

```
{
    "count": 1
}
```

<p>
これでどうだ！

```JS
console.log(JSON.stringify(rows[0]).count);
```
<p>
と思ったら、あれ？

```
undefined
```

<p>
実は、
いったん parseしないといけません。

```JS
console.log(JSON.parse(JSON.stringify(rows[0])).count);  
```

<p>
やっと数値をとることができました。

```
1
```

<br>
まとめますと、これが正解

```JS:index.js
'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) AS count from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(JSON.parse(JSON.stringify(rows[0])).count);
    });
}
```
<br><br>

##追記 （実はもっと簡単な方法が・・・）
ここまで読んでいただいて、ありがとうございます。

実は、こんな面倒なことをしなくても、簡単な方法がありました！

ツイッターで、親切な方が教えてくれました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">rows[n]で1つのオブジェクトになってるので、単にrows[0].countまたはrows[0][&quot;count(*)&quot;]でいけますよ！</p>&mdash; masaki ohashi (@ohashimasaki) <a href="https://twitter.com/ohashimasaki/status/1405507602667114500?ref_src=twsrc%5Etfw">June 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p><p>
これです。

```JS
console.log(rows[0].count);
```

<p>
つまり、

```JS:index.js
'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) AS count from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(rows[0].count);
    });
}
```
<p>
いやー、一体私は何をしてるやら・・・。

とはいえ、試行錯誤は大事です。
と自分に言い聞かせます。

<br>

##参考サイト
[How to get COUNT(*) variable] (https://github.com/mysqljs/mysql/issues/1519)

<br>