جافاسكريبت - 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
