#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: новые игрушки «. Ссылки в моем профиле, если вам интересно.