😥

Node.js で Google Drive API を使うときのつまづきポイントなどメモ

2024/12/17に公開

はじめに

ゆるいです。
どこに書くか迷いましたが、見返しやすいのが一番ということでここに。

Node.js と npm

TypeScript で検索すると npm が出てきて、npm で検索すると Node.js が出てきて、結局はじめは何をしないといけないのか、ちょっと迷いました。結論としては、はじめに以下 Node.js の公式サイトからファイルをダウンロードしてきて、インストールします。ダウンロードページにちゃんと「Node.js includes npm」と書いてありました。困ったときは公式サイトをよく読もう。

インストールしたらすぐに npm コマンドが使えるようになります。コマンドはこんな感じで……。ここまでわかっていればググればなんとかなるはず (多分)。あと tsc とか ts-node とかも必要あったようななかったような。

> npm install -g npm@latest
> npm install -g node@latest
> npm init --yes
> npm install typescript @types/node --save-dev

ちなみに今回 IDE は WebStorm を選びました。Node.js インストール後は WebStorm を再起動しましょう!

Google Drive API の http2 オプションについて

npm で Google Drive API のパッケージを入れて、じゃあ早速 drive.files.create するか~~。と思って実行すると、意味の分からない挙動をして苦しみました!が、どうやら http2 オプションを true にしたのがバグる原因のようです!

❌ 以下は変な挙動します。

NG
google.drive({version: 'v3', auth: authClient, http2: true, timeout: 999})

⭕ こちらは動かした感じ、大丈夫そうです!

OK
google.drive({version: 'v3', auth: authClient, http2: false})

MIME Type 判定 ってどうすればいいですか?

分からないなりにこんな感じにしてみました。どうするのが一般的なんでしょうか?

import {createReadStream} from 'node:fs';
import {default as mime} from 'mime'; // https://www.npmjs.com/package/mime
import {fileTypeFromStream} from 'file-type'; // https://www.npmjs.com/package/file-type

/**
 * MIME Type 判定
 *
 * @param {string} filePath
 * @return {Promise<string>}
 */
async function mimeTypeDetermination(filePath: string): Promise<string> {

    const unknownFileExtension = 'application/octet-stream';
    const readRangeOfBytes: { start: number, end: number } = { start: 0, end: 4099 }; // reasonableDetectionSizeInBytes = 4100;

    const fileTypeStream = createReadStream(filePath, readRangeOfBytes);
    const fileType = await fileTypeFromStream(fileTypeStream);

    let mimeType: string;
    if (fileType) {
        mimeType = fileType.mime;  // ファイルデータから mimeType を判断
    } else {
        mimeType = mime.getType(filePath) || unknownFileExtension; // 拡張子から mimeType を判断
    }

    return mimeType;

}

WebStorm で file-type を使う

上記の MIME Type 判定コードですが、WebStorm だと file-type の package.json でエラーが出ました。「"exports" 内のどのファイルを見ればいいのかわからん」みたいなエラーでした (うろ覚え)。なので、file-type の package.json に、以下の通り "require": "./index.js" を追記しました (当て勘方式)。

追記後
	"exports": {
		".": {
			"node": {
				"types": "./index.d.ts",
				"import": "./index.js",
				"require": "./index.js"
			},
			"default": {
				"types": "./core.d.ts",
				"import": "./core.js"
			}
		}
	},

参考

Discussion