【发布时间】:2021-05-11 08:42:06
【问题描述】:
我在 NestJS 的一个端点上有一个奇怪的行为,它提供一段 JSON。 带有 JSON 对象的 JS 正在导出
module.exports = Object.freeze({
translation: {
TestMessage: 'Bienvenue à React et react-i18next'
}
});
客户端上的结果是:
{
"translation": {
"TestMessage": "Bienvenue à React et react-i18next"
},
"default": {
"translation": {
"TestMessage": "Bienvenue à React et react-i18next"
}
}
}
问题是“默认”从何而来?
在模块、控制器和服务下方绘制全图:
模块
import { Module } from '@nestjs/common';
import { LoggerService } from '@modules/logger';
import { I18nController } from './i18n.controller';
import { I18nService } from './i18n.service';
@Module({
controllers: [I18nController],
providers: [I18nService, LoggerService],
exports: [I18nService]
})
export class I18nModule {}
控制器
import { Controller, Get, Param } from '@nestjs/common';
import { LoggerService } from '@modules/logger';
import { I18nService } from './i18n.service';
@Controller('i18n')
export class I18nController {
constructor(private logger: LoggerService, private i18nService: I18nService) {
this.logger.setContext(I18nController.name);
}
@Get('/:lang')
async getLanguage(@Param('lang') lang: string) {
console.log(lang);
return await this.i18nService.findOneByLanguageCode(lang);
}
}
服务
import { Injectable } from '@nestjs/common';
import { access } from 'fs/promises';
import { constants as fsconstants } from 'fs';
@Injectable()
export class I18nService {
async findOneByLanguageCode(language: string): Promise<any | null> {
const languagefile = __dirname + '/../../public/languages/' + language + '.js';
await access(languagefile, fsconstants.R_OK);
return await import(languagefile);
}
}
从客户端我做了一个简单的 http://localhost:3001/i18n/fr-FR 并得到上述结果。
再次,“默认”部分来自哪里?
【问题讨论】:
-
您的
tsconfig中是否恰好有allowSyntheticDefaultImports?这看起来像import正在读取default导出,因此 JSON 中的default。 -
是的!!,就是这样。 @JayMcDoniel,你是英雄。非常感谢。在有关 allowSyntheticDefaultImports (typescriptlang.org/tsconfig#allowSyntheticDefaultImports) 的文档中:“为方便起见,如果没有创建,像 Babel 这样的编译器会自动创建一个默认值。”
标签: nestjs