呪いの概要
とあるクイズアプリを作成中、discord OAuth2を使おうとし、config.json
からclientIDを取得したところ、下三桁が__870__から__800__に置き換わっていた。
{
"clientId": xxxxxxxxxx870
}
const { clientId } = require('../config.json')
console.log(clientId)
// xxxxxxxxxx800
原因解明のために
console.log()
まず、何が起こってるのか正直わからなかったため、とりあえずconsole.log(clientID)
で表示してみたが、やはり下三桁が__800__になっていた。
ファイルの新規作成
これはやばいと思い、とりあえずファイルを削除。
もちろん、変数を取得できないため、ビルドエラーを吐いた。
全く同じ内容を記述し、実行したところ、ビルドエラーは出なかったが、やはり、下三桁が__870__から__800__に置き換わっていた。
キー名を変更
次に、キー名を変えたらどうなるのかと思い、ふざけてabcdefg
に変更してみた。
特にエラーを吐くことなくビルドできたが、出てきた数値の下三桁は__800__になっていた。
{
- "clientId": xxxxxxxxxx870
+ "abcdefg": xxxxxxxxxx870
}
- const { clientId } = require('../config.json')
- console.log(clientId)
+ const { abcdefg } = require('../config.json')
+ console.log(abcdefg)
数値を変更
過去に、ユーザー管理用discord botを作ったときに、ユーザー名の文字列が原因で文字コードエラーが起こり、保存されていた文字列が全く違うものになっていた事件を思い出し、キーだけでなくバリューも変更してみた。
なんと、、、
ここで設定した値も下三桁が書き換えられていた。ここでの数値の下三桁は__343__だった。しかし、console.log()
して出てきた数値の下三桁は、__400__という数値だった。
最初と同じように、下三桁以外は指定したものと全く同じなのに、下三桁が違う。
{
- "abcdefg": xxxxxxxxxx870
+ "abcdefg": xxxxxxxxxx343
}
ファイル名の変更
キーとバリューを変更してもうまくいかなかったため、ファイル名
を変更してみた。
config.json
-> data.json
{
"abcdefg": xxxxxxxxxx343
}
まぁ、結果は、、、
下三桁が400になっていた。
intで入れる必要なくない?
よくよく考えたら、discord OAuth2で使うので、ここで取得した値はurlに埋め込まれる。
int型である必要なくない?
String型にしました。
{
- "abcdefg": xxxxxxxxxx343
+ "abcdefg": "xxxxxxxxxx343"
}
なんということでしょう!
さっきまで下三桁が__400__になっていた値の下三桁が__343__になってる!
まとめ
config.json
のバリューに int を使うのはやめとこう!
@masato_makino さんからのコメントによると、
16桁 の数値を超えた場合、誤差が発生するそうです。
ここで使おうとしていたのは、18桁
数字がおかしくなるのは、必然だったみたいです。
結論
16桁を超える数字を使うときは、intではなく、String型で保存するほうが良い。