javascript - ERR_IMPORT_ASSERTION_TYPE_MISSING pentru importul unui fișier json


Acest cod funcționa bine.

Nu știu dacă este pentru că am făcut upgrade la Node 17 sau ce, dar acum primesc

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"

În fișierul meu api.ts am:

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

Iată cum încep api.ts care este folosit de server.ts:

NODE_ENV=production node --optimize_for_size --trace-warnings --experimental-json-modules --no-warnings server/server.js

Răspuns #1

Actualizare: Conform propunerii, cuvântul cheie nou este with în loc de assert, dar assert ar trebui să rămână din motive de compatibilitate. Codul nou ar arăta astfel:

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

Va trebui să folosiți:

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

https://github.com/tc39/proposal-import-assertions

Răspunsul #2

Pentru oricine are probleme de validare ESLint (din cauza faptului că assert nu este încă acceptat), puteți încerca să încărcați JSON-ul din sistemul de fișiere sincron:

const loadJSON = (path) => JSON.parse(fs.readFileSync(new URL(path, import.meta.url)));

const countries = loadJSON('./data/countries.json');

Referință: https://github.com/eslint/eslint/discussions/15305

Răspunsul #3

Pentru a importa .json în modulele ES poți folosi

module.createRequire()

https://nodejs.org/dist/latest-v18.x/docs/api/esm.html#no-require-exports-or-moduleexports

deoarece afirmațiile sunt încă experimentale în v18.12.1 de node.js

import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);

const countryTable = require('./data/countries.json');

https://nodejs.org/dist/latest-v18.x/docs/api/module.html#modulecreaterequirefilename