ERR_IMPORT_ASSERTION_TYPE_MISSING エラーの解決方法
問題点
Node.js 17以降でJSONファイルをインポートする際に、以下のエラーが発生することがあります:
TypeError [ERR_IMPORT_ASSERTION_TYPE_MISSING]:
Module "file:///Users/xxxxx/code/projects/xxxxx/dist/server/data/countries.json"
needs an import assertion of type "json"
このエラーは、次のようなコードで発生します:
import countryTable from './data/countries.json';
原因
Node.js 17以降、ESモジュールでJSONファイルをインポートするには、明示的な型アサーションが必要になりました。これはセキュリティとデータの整合性を確保するための仕様変更です。
解決方法
方法1: インポートアサーションを使用する(Node.js 17.1.0+)
Node.js 17.1.0以降では、with
キーワードを使用したインポートアサーションが推奨されます:
import countryTable from "./data/countries.json" with { type: "json" };
TIP
assert { type: "json" }
も互換性のために利用できますが、新しいコードではwith
構文を使用することが推奨されます。
方法2: createRequireを使用する(Node.js 12.2.0+)
CommonJSスタイルのrequire関数を作成してJSONを読み込む方法:
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const countryTable = require('./data/countries.json');
方法3: ファイルシステムで直接読み込む
JSONファイルを同期的に読み込む方法:
import { readFileSync } from 'node:fs';
const loadJSON = (path) => JSON.parse(readFileSync(new URL(path, import.meta.url)));
const countries = loadJSON('./data/countries.json');
非同期で読み込む場合:
import { readFile } from 'node:fs/promises';
const swaggerDoc = JSON.parse(
await readFile(new URL('../swagger.json', import.meta.url))
);
バージョン別の注意点
WARNING
- Node.js 16以前では、
--experimental-json-modules
フラグが必要でした - Node.js 17.1.0以降では、インポートアサーションが必須になりました
- Node.js 18.12.1時点では、アサーション機能はまだ実験的機能です
ESLintに関する注意点
インポートアサーション構文がESLintでサポートされていない場合、ファイルシステムを使用した読み込み方法(方法3)が有効です。
まとめ
JSONファイルのインポート方法はNode.jsのバージョンによって異なります:
- 最新バージョン:
import ... with { type: "json" }
を使用 - 広範な互換性:
createRequire
を使用 - ツールの制約: ファイルシステム読み込みを使用
プロジェクトのNode.jsバージョンと使用しているツールチェーンに応じて、適切な方法を選択してください。