NestJS服务JSON并添加一个;“违约”;部分重复JSON

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

我在为一段JSON服务的NestJS中的端点上有一个奇怪的行为。 带有JSON对象的JS正在导出

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的帮助和干杯!