جافاسكريبت - ERR_IMPORT_ASSERTION_TYPE_MISSING عند استيراد ملف json


كان هذا الكود يعمل بشكل جيد.

لا أعرف إذا كان ذلك بسبب أنني قمت بالترقية إلى Node 17 أم ماذا، لكن الآن أحصل على

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"

في ملف api.ts لدي:

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

إليك كيف أبدأ api.ts الذي يستخدمه server.ts:

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

الإجابة رقم 1

تحديث: وفقًا للاقتراح، الكلمة الرئيسية الجديدة هي with بدلاً من assert، ولكن من المفترض أن تبقى assert لأسباب التوافق. سيكون الكود الجديد كما يلي:

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

ستحتاج إلى استخدام:

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

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

الإجابة رقم 2

لأي شخص يواجه مشاكل في التحقق من ESLint (بسبب عدم دعم assert بعد)، يمكنك محاولة تحميل JSON من نظام الملفات بشكل متزامن:

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

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

المرجع: https://github.com/eslint/eslint/discussions/15305

الإجابة رقم 3

لاستيراد .json في وحدات ES يمكنك استخدام

module.createRequire()

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

لأن التأكيدات لا تزال تجريبية في الإصدار 18.12.1 من 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