从 node.js 和 Typescript 中的动态文件名加载 JSON 的最佳方法是啥?

Posted

技术标签:

【中文标题】从 node.js 和 Typescript 中的动态文件名加载 JSON 的最佳方法是啥?【英文标题】:What is the best way to load JSON from a dynamic filename in node.js & Typescript?从 node.js 和 Typescript 中的动态文件名加载 JSON 的最佳方法是什么? 【发布时间】:2019-07-11 02:34:45 【问题描述】:

我正在使用 node.js 和 Typescript 创建一个简单的 Web 应用程序来建立我对它的熟悉,我想知道加载 JSON 配置文件的最佳方式,该文件名在运行时确定。

我在网上找到了一些建议:

Using the fs module in node Importing the JSON file like a module

第一种方法看起来应该可行,但第二种方法似乎更整洁。问题是使用第二种方法,我有以下错误:

An import declaration can only be used in a namespace or module. ts(1232)

因为我想在构造函数中导入文件,并将文件名指定为参数。其次,如果我尝试将给定的文件名附加到我想从中获取它的常量目录中,则会收到以下错误:

';' expected. ts(1005)

这是我尝试加载 JSON 的类中的(非编译)代码 sn-p,以及我尝试加载的示例 JSON 文件。

打字稿类:

import Floor from './Floor'
import Elevator from './Elevator'
import Person from './Person'

class Building 

    public name: string
    private floors: Floor[]
    private elevators: Elevator[]
    private people: Person[]
    private time: number

    constructor(config_filename: string) 
        import * as config from '../config/'+config_filename
        const building = (<any>config).building
        this.name = name
        this.floors = []
        building.floors.forEach((floor) => 
            this.floors.push(new Floor(floor.number, floor.name))
        )
        this.elevators = []
        building.elevators.forEach((elevator) => 
            this.elevators.push(new Elevator(elevator.name, elevator.weight_capacity, elevator.start_floor_no, this))
        )
        this.people = []
        building.people.forEach((person) => 
            const person_instance = new Person(person.name, 10, person.algorithm)
            this.people.push(person_instance)
            this.floors[person.start_floor_no].addOccupant(person_instance)
        )
        this.time = 0
    
...

示例 JSON 配置文件:


    "building": 
        "name": "Basic Inc.",
        "floors": [
            
                "number": 0,
                "name": "Ground Floor"
            ,
            
                "number": 1,
                "name": "1st Floor"
            
        ],
        "elevators": [
            
                "name": "Bruce",
                "weight_capacity": 100,
                "start_floor_no": 0
            
        ],
        "people": [
            
                "name": "Wendy Fox",
                "start_floor_no": 0,
                "algorithm": "desk"
            
        ]
    

我应该坚持第一种方法,还是有一些更简洁的方法来加载 JSON 文件,文件名只有在运行时才知道?

【问题讨论】:

【参考方案1】:

在您的示例中,import 语句适用于 TS 被“编译”为 JS 时,而不是在运行时使用 new Building(&lt;name&gt;)(当代码实际执行时,编译后节点进程)。

选项 1 对于 Node.js 来说是一个很好的方法。我想你正试图摆脱尴尬的 fs 函数。

另一种选择是使用从代码到自身的 GET 请求,虽然它表面上是相同的,但您可以轻松探索更简洁的 async / await 函数*。

*(几个月前我使用了 fs,但我尝试过使用 async/await 却失败了,但现在可能已经改变了吗?)

【讨论】:

感谢您的建议。最后我决定将 fs 与 JSON.parse 一起使用,它并不像我最初想象的那样尴尬。谢谢!

以上是关于从 node.js 和 Typescript 中的动态文件名加载 JSON 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何清理 Node.js 和 Typescript 中的响应正文

Visual Studio 与 WebStorm 中的 Typescript 编译 - 两者都使用 Node.js 进行编译吗?

从 Node.js 导入断言的 TypeScript 2.0 / ES2015 方式是啥?

将 Node.js 项目从普通 ES6 迁移到 TypeScript

如何使用 Node.js 包中的 TypeScript 键入信息?

什么 TypeScript 配置产生最接近 Node.js 16 功能的输出?