Node.js で Google Drive API を使うときのつまづきポイントなどメモ
はじめに
ゆるいです。
どこに書くか迷いましたが、見返しやすいのが一番ということでここに。
Node.js と npm
TypeScript で検索すると npm が出てきて、npm で検索すると Node.js が出てきて、結局はじめは何をしないといけないのか、ちょっと迷いました。結論としては、はじめに以下 Node.js の公式サイトからファイルをダウンロードしてきて、インストールします。ダウンロードページにちゃんと「Node.js includes npm」と書いてありました。困ったときは公式サイトをよく読もう。
- Node.js — Run JavaScript Everywhere
インストールしたらすぐに 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 を再起動しましょう!
- WebStorm: JetBrains による JavaScript および TypeScript IDE
Google Drive API の http2 オプションについて
npm で Google Drive API のパッケージを入れて、じゃあ早速 drive.files.create
するか~~。と思って実行すると、意味の分からない挙動をして苦しみました!が、どうやら http2
オプションを true
にしたのがバグる原因のようです!
- HTTP/2 session is closed while file beeing uploaded · Issue #504 · googleapis/nodejs-googleapis-common
❌ 以下は変な挙動します。
google.drive({version: 'v3', auth: authClient, http2: true, timeout: 999})
⭕ こちらは動かした感じ、大丈夫そうです!
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"
}
}
},
参考
- HTTP/2 session is closed while file beeing uploaded · Issue #504 · googleapis/nodejs-googleapis-common
- package.jsonのexportsフィールドについて
Discussion