Skip to content

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"

このエラーは、次のようなコードで発生します:

javascript
import countryTable from './data/countries.json';

原因

Node.js 17以降、ESモジュールでJSONファイルをインポートするには、明示的な型アサーションが必要になりました。これはセキュリティとデータの整合性を確保するための仕様変更です。

解決方法

方法1: インポートアサーションを使用する(Node.js 17.1.0+)

Node.js 17.1.0以降では、withキーワードを使用したインポートアサーションが推奨されます:

javascript
import countryTable from "./data/countries.json" with { type: "json" };

TIP

assert { type: "json" }も互換性のために利用できますが、新しいコードではwith構文を使用することが推奨されます。

方法2: createRequireを使用する(Node.js 12.2.0+)

CommonJSスタイルのrequire関数を作成してJSONを読み込む方法:

javascript
import { createRequire } from 'node:module';

const require = createRequire(import.meta.url);
const countryTable = require('./data/countries.json');

方法3: ファイルシステムで直接読み込む

JSONファイルを同期的に読み込む方法:

javascript
import { readFileSync } from 'node:fs';

const loadJSON = (path) => JSON.parse(readFileSync(new URL(path, import.meta.url)));
const countries = loadJSON('./data/countries.json');

非同期で読み込む場合:

javascript
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バージョンと使用しているツールチェーンに応じて、適切な方法を選択してください。