динамический импорт typescript express

#typescript #express #import

#typescript #экспресс #импорт

Вопрос:

 import * as dotenv from 'dotenv';
dotenv.config();
const env: string = process.env.NODE_ENV || 'development';

export const cnf = async () => {
  const data = await import('./config.'   env);
  console.log('data');
  return data;
};
 

из моего app.ts

 import * as confgg from '../../config';
class App {
  public app: express.Application;
  private host: string = process.env.IP || process.env.ADMIN_HOST || cnf.get('web.host');
  private port: number = parseInt(process.env.PORT, 10) || parseInt(process.env.ADMIN_PORT, 10) || cnf.get('web.port');

  private mysql = MySql.getInstance();

  constructor(private readonly config: AppConfig) {
    this.app = express();
    this.initializeInfoLoggingHandling();
    console.log(confgg)
  }
 

эта консоль.печать журнала

 { cnf: [Function (anonymous)] }
 

но он должен печатать некоторый массив.
Я просто пытаюсь динамически загрузить свою конфигурацию.

Ответ №1:

эта консоль.печать журнала { cnf: [Функция (анонимная)] }

но он должен печатать некоторый массив.

Предполагается, что он показывает именно это, потому что вы экспортируете функцию, используя именованный экспорт, но импортируете объект пространства имен модуля, который имеет свойство для каждого экспорта. Итак, вы видите объект (объект пространства имен модуля) со свойством ( cnf ), которое ссылается на функцию ( async экспортируемую функцию).

Если вы хотите использовать динамический импорт и сделать свой экспорт результатом этого динамического импорта, вам нужно заставить свой модуль ждать его с помощью верхнего уровня await :

config.ts :

 import * as dotenv from 'dotenv';
dotenv.config();
const env: string = process.env.NODE_ENV || 'development';

// Top-level await waits for the import to finish
const data = await import('./config.'   env);
console.log('data');

export default data; // See note below
 

затем импортируйте объект пространства имен по умолчанию, а не объект пространства имен модуля:

 import confgg from '../../config';
 

Вы не показали, что представляет собой содержимое ваших config.development файлов etc., но data будете объектом пространства имен модуля для информации о конфигурации, вместо этого вы можете экспортировать одно из его свойств.


Обратите внимание, что верхний уровень await — это все еще только предложение, хотя оно уже очень далеко продвинулось и присутствует в популярных движках JavaScript и сборщиках модулей.

Комментарии:

1. FWIW, я перехожу к импорту и экспорту модулей JavaScript, динамическому импорту и верхнему уровню await в главах 13 и 19 моей недавней книги » JavaScript: новые игрушки «. Ссылки в моем профиле, если вам интересно.