[npm] npm install したら `npm ERR! code EINTEGRITY` などと原因不明のエラーが出た時

# 概要

題名の通り。
なんのエラーか全然わかりませんでした。

# 実行したコマンド

```bash
$ npm install material-dashboard

# 以下、実行結果
npm ERR! code EINTEGRITY
npm ERR! sha512-de6if9WnelNvQdtLRcyTao3vx1ESjOVsX6tiwAmSjJvfBHcHgKO9wP54jYLfYIn3ILbluqXh1GXPqubNLgH/Kg== integrity checksum failed when using sha512: wanted sha512-de6if9WnelNvQdtLRcyTao3vx1ESjOVsX6tiwAmSjJvfBHcHgKO9wP54jYLfYIn3ILbluqXh1GXPqubNLgH/Kg== but got sha512-8Gs0/uEiiQFzPso2htb5dAgIvnGr2Aoba/KxCRTCJdpqmJ1XYDrZMCqJ/C8S0EVX39uvvRbid7GRBCh+Zy7TGQ==. (5701192 bytes)

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user_name/.npm/_logs/2021-03-20T12_55_13_895Z-debug.log
```

はい？

# 対策

以下のような記事が目立ったので、全部やりました。

- `package-lock.json`を削除しろ
- `$ npm install -g npm`してバージョンを上げろ
- `$ npm cache clean --force`してキャッシュをクリアしよう

どれが効いたのかは正直わかっていません。
少なくとも、どれか1個ではうまくいきませんでした。

他にもいくつかコマンドを打ったので、詳細は**実行したコマンドたち**を参照していただけたらと思います。

## 結果（記録している範囲で）

いろんなコマンドを手あたり次第打ったので、どれが効いていてどれが効いてないのかよくわかりません。

が、後で同じ問題にぶつかったときに役に立ちそうなので、**発生したエラー**と、**効いている可能性があるコマンド**を記録しておくことにしました。

### エラーたち

#### 1. ???

どのコマンドを打った時かは忘れましたが、次のエラーも出ました

```bash
npm ERR! invalid json response body at http://registry.npmjs.org/ansi-escapes reason: Unexpected end of JSON input
```

`npm install`コマンドを打った時なのですが、何をinstallしようとしたときだったのかは覚えていません。

少なくとも、次のうちのどちらかでした

- `$ npm install material-dashboard`
- `$ npm install -g npm`

#### 2. `npm install -g npm` 時のエラー

```bash
$ npm install -g npm

# 以下、実行結果
...(行数が多すぎて消えた。少なくとも数百行は出ていた。)
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar TAR_ENTRY_INVALID checksum failure
npm WARN tar zlib: incorrect data check
npm WARN tarball tarball data for npm@https://registry.npmjs.org/npm/-/npm-7.6.3.tgz (sha512-+Cs8TEtkfdQGTIPw8AeqVtNNHyo1Zw8HATzAFFWYnK7jQYgT/CatEy85+BlEoEpqvga2uaKqVrXsTAYj28emjg==) seems to be corrupted. Trying again.
npm ERR! code Z_DATA_ERROR
npm ERR! errno -3
npm ERR! zlib: incorrect data check

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user_name/.npm/_logs/2021-03-20T12_39_47_633Z-debug.log
```

#### 3. `npm cache clean --force` 時のエラー

一時的ではありましたが、`npm cache clean --force`すら動かなくなったタイミングもありました

その時には、
`sudo chown -R 1000:1000 "/home/user_name/.npm"`
してくださいというメッセージが出ていたので、その通りに打ちました。

### 実行したコマンドたち

同じコマンドを何回も順番ぐちゃぐちゃで打っていますので、正しい順番はわかりません

```bash
# .npmディレクトリの権限を書き換えるコマンド
# npmのバグで、権限が勝手に書き換わることがあるらしく、何かのエラーが出た時に「このコマンドを打ってね」、と表示されたので打った
# たしか、`$ npm cache clean --force`できなかったときにこのコマンドを打つように促された気がする
$ sudo chown -R 1000:1000 "/home/user_name/.npm"

# npm本体のアップデート用のコマンド
$ npm update -g npm
$ sudo npm i -g npm to update

# npmのキャッシュ問題があるときの対策のよう
$ npm cache clean --force
$ npm cache verify

# npm系コマンドの実行時エラー結果を見る
$ cat /home/user_name/.npm/_logs/ yyyy-MM-ddTHH:mm:ss.SSSZ-debug.log

# なんのコマンドかはわからないが、github issue内の対策として評価が異様に高かったので、何も考えずに打った
$ npm install --update-binary --no-shrinkwrap
```

ただ、これらのうちどれか、またはいずれかの組み合わせが効いたらしく、無事`$ npm install {module}`できるようになりました。

# ひとこと

正直、何が原因で、何が効いたのかを調べないといけないとは思ってはいるものの、しばらく触っていなかった環境で起こったことであったため、心当たりは全くなかった。

ということもあり、運任せの対処になってしまっています。
もし、普段よく触っている環境で同じ問題が発生したら、直前の操作などから原因もつかめるかと思うので、そのときはもう少し詳しい因果関係も追記したいと思います。

# 参考記事

- [npm / npm - npm ERR! code EINTEGRITY (npm 5) #16861](https://github.com/npm/npm/issues/16861)
- [Npm installを実行すると、ERR！が返されます。コードEINTEGRITY`（npm 5.3.0）](https://www.it-swarm.jp.net/ja/node.js/npm-install%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81err%EF%BC%81%E3%81%8C%E8%BF%94%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%82%B3%E3%83%BC%E3%83%89eintegrity%60%EF%BC%88npm-530%EF%BC%89/835333208/)
- [stackoverflow - npm ERR! invalid json response body at http://registry.npmjs.org/ansi-escapes reason: Unexpected end of JSON input](https://stackoverflow.com/questions/64625539/npm-err-invalid-json-response-body-at-http-registry-npmjs-org-ansi-escapes-re)
- [cncjs / cncjs - npm v5.0.3 installation integrity checksum failure #172](https://github.com/cncjs/cncjs/issues/172)  
`$ npm install --update-binary --no-shrinkwrap`はここで見つけた
- [npm Docs](https://docs.npmjs.com/common-errors#invalid-json)  
npmの公式ドキュメントだが、今回は特に役に立たなかった

# 追記 2021/03/21 22:51

また同じエラーが発生した。
今度は、次の2つのコマンドだけで解決できた。

```bash
$ npm cache clean --force
$ npm cache verify
```

何か環境が壊れている可能性がある...

ちなみに、その後ちょうど以下のメッセージが出たので、ついでに`npm`も更新しておいた

```bash
   ╭───────────────────────────────────────────────────────────────╮
   │                                                               │
   │      New major version of npm available! 6.14.8 → 7.6.3       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v7.6.3   │
   │               Run npm install -g npm to update!               │
   │                                                               │
   ╰───────────────────────────────────────────────────────────────╯
```

```bash
$ sudo npm install -g npm
```

`npm`のバージョン(6.14.8)が古すぎたことが原因であった可能性はあるかもしれない( ˘ω˘)ｽﾔｧ