मैं इसके साथ अपनी परिचितता बनाने के लिए नोड.जेएस और टाइपस्क्रिप्ट के साथ एक साधारण वेब एप्लिकेशन बना रहा हूं, और मैं एक JSON कॉन्फ़िगरेशन फ़ाइल लोड करने का सबसे अच्छा तरीका जानना चाहता हूं जिसका फ़ाइल नाम रनटाइम पर निर्धारित होता है।

मुझे कुछ सुझाव ऑनलाइन मिले हैं:

पहला दृष्टिकोण ऐसा प्रतीत होता है जैसे इसे काम करना चाहिए, लेकिन दूसरा बहुत अधिक साफ-सुथरा लगता है। समस्या यह है कि दूसरे दृष्टिकोण के साथ, मुझे निम्न त्रुटि है:

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

क्योंकि मैं एक तर्क के रूप में निर्दिष्ट फ़ाइल नाम के साथ एक निर्माता में फ़ाइल आयात करना चाहता हूं। दूसरा, मुझे निम्न त्रुटि मिलती है यदि मैं दिए गए फ़ाइल नाम को उस निरंतर निर्देशिका में जोड़ने का प्रयास करता हूं जिसे मैं इसे प्राप्त करना चाहता हूं:

';' expected. ts(1005)

यहां उस वर्ग से एक (गैर-संकलन) कोड स्निपेट है जिसमें मैं JSON लोड करने का प्रयास कर रहा हूं, और एक उदाहरण 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"
            }
        ]
    }
}

क्या मुझे पहले दृष्टिकोण के साथ रहना चाहिए, या जेएसओएन फ़ाइल को केवल रनटाइम पर ज्ञात फ़ाइल नाम के साथ लोड करने का कोई साफ तरीका है?

4
Rob Streeting 17 फरवरी 2019, 18:51

1 उत्तर

सबसे बढ़िया उत्तर

आपके उदाहरण में, import कथन तब लागू होता है जब TS को JS में 'संकलित' किया जाता है, न कि रनटाइम पर new Building(<name>) के साथ (जब कोड वास्तव में निष्पादित होता है, बाद द्वारा संकलन नोड प्रक्रिया)।

विकल्प 1 इसे नोड के लिए करने का एक अच्छा तरीका है। मुझे लगता है कि आप अजीब fs कार्यों से दूर होने की कोशिश कर रहे हैं।

एक अन्य विकल्प कोड से स्वयं के लिए एक GET अनुरोध का उपयोग करना है, हालांकि यह स्पष्ट रूप से समान है, आप आसानी से async / await फ़ंक्शंस का पता लगा सकते हैं जो थोड़े नटखट हैं*।

* (पिछली बार कुछ महीने पहले मैंने एफएस का इस्तेमाल किया था, मैंने कोशिश की लेकिन इसे एसिंक/प्रतीक्षा के साथ जाने में असफल रहा, लेकिन संभवतः यह अब बदल गया है?)

2
Tobin 17 फरवरी 2019, 16:00