NestJS服务JSON并添加一个;“违约”;部分重复JSON
我在为一段JSON服务的NestJS中的端点上有一个奇怪的行为。 带有JSON对象的JS正在导出NestJS服务JSON并添加一个;“违约”;部分重复JSON,nestjs,Nestjs,我在为一段JSON服务的NestJS中的端点上有一个奇怪的行为。 带有JSON对象的JS正在导出 module.exports=Object.freeze({ 翻译:{ TestMessage:'BienvenueáReact et React-i18next' } }); 客户端上的结果是: { "translation": { "TestMessage": "Bienvenue à React et react-i1
module.exports=Object.freeze({
翻译:{
TestMessage:'BienvenueáReact et React-i18next'
}
});
客户端上的结果是:
{
"translation": {
"TestMessage": "Bienvenue à React et react-i18next"
},
"default": {
"translation": {
"TestMessage": "Bienvenue à React et react-i18next"
}
}
}
问题是“违约”从何而来
在模块、控制器和服务下方绘制全图:
模块
从'@nestjs/common'导入{Module};
从“@modules/logger”导入{LoggerService};
从“./i18n.controller”导入{I18nController};
从“/i18n.service”导入{I18nService};
@模块({
控制器:[I18nController],
提供者:[I18N服务,日志服务],
导出:[i18n服务]
})
导出类I18nModule{}
控制器
从'@nestjs/common'导入{Controller,Get,Param};
从“@modules/logger”导入{LoggerService};
从“/i18n.service”导入{I18nService};
@控制器('i18n')
导出类I18N控制器{
构造函数(专用记录器:LoggerService,专用I18N服务:I18N服务){
this.logger.setContext(I18nController.name);
}
@获取(“/:lang”)
异步getLanguage(@Param('lang')lang:string){
console.log(lang);
返回等待此.i18n服务.findOneByLanguageCode(lang);
}
}
服务
从'@nestjs/common'导入{Injectable};
从“fs/promises”导入{access};
从“fs”导入{常量作为fsconstants};
@可注射()
导出类I18N服务{
异步findOneByLanguageCode(语言:string):Promise{
const languagefile=uu dirname+'/../public/languages/'+language+'.js';
等待访问(语言文件,fsconstants.R_OK);
返回等待导入(语言文件);
}
}
从客户端我做了一个简单的http://localhost:3001/i18n/fr-FR
并得到上述结果
同样,“默认”部分从何而来?在
tsconfig.json中应该启用esModuleInterop
默认导入类似于“时刻”中的导入时刻,其作用与const moment=require(“时刻”)相同。默认值
这就是为什么存在default
对象的原因
tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true, // change it to false or remove it
}
}
您的tsconfig
中是否碰巧有allowSyntheticDefaultImports
?这看起来像是import
正在读取default
导出,因此JSON中的default
。是的!!,就这样@杰姆克多尼尔,你是个英雄。非常感谢。在关于allowSyntheticDefaultImports()的文档中:“为了方便起见,像Babel这样的Transpiler会在没有创建默认值的情况下自动创建一个默认值。”我已经将esModuleInterop设置为True。解决方案是allowSyntheticDefaultImports,它创建了额外的默认部分。感谢您努力回答我的问题。我的意思是设置“esModuleInterop”:false
,在我的例子中,“esModuleInterop”:false
解决问题,但不要设置allowSyntheticDefaultImports
。但是你会发现allowSyntheticDefaultImports:false
对你有帮助,所以感谢@JayMcDoniel的帮助和干杯!