1

I have a very strange issue. I've got a backend api to import a json data to my mongodb.

On the screen I have a upload button to upload a file and I used react-dropzone for that. For example think that I have a file like "db.json" and in this file there is a json like as follows

{
"datapointtypes":[
    {"id":"Wall plug","features":[{"providesRequires":"provides","id":"Binary switch"},{"providesRequires":"requires","id":"Binary sensor","min":"1","max":"2"}],"parameters":[{"id":"Communication type","type":"Communication type"}],"functions":[{"id":"Electricity"},{"id":"Switch"}]},
    {"id":"Door sensor","features":[{"providesRequires":"provides","id":"Binary sensor"}],"parameters":[{"id":"Communication type","type":"Communication type"}],"functions":[{"id":"Door"},{"id":"Sensor"}]}
],
"datatypes":[
    {"id":"Communication type","type":"enum","values":[{"id":"Zwave"},{"id":"Zigbee"}]},
    {"id":"Zigbee network address","type":"decimal","min":1,"max":65336,"res":1},
    {"id":"Serial port","type":"string"}
],
"features":[
    {"id":"Zwave receiver","exposedtype":"Zwave command","functions":[{"id":"Communication"}]},
    {"id":"Zigbee receiver","exposedtype":"Zigbee command","functions":[{"id":"Communication"}]},
    {"id":"Binary switch","exposedtype":"On off state","functions":[{"id":"Actuator"}]},
    {"id":"Binary sensor","exposedtype":"On off state","functions":[{"id":"Sensor"}]}
],
"servicetypes":[
    {"id":"Room controller","datapointtype":"Room controller","DelayActive":false,"DelayValue":""},
    {"id":"Xiaomi door sensor","datapointtype":"Door sensor","parameters":[{"id":"Zigbee network address","type":"Zigbee network address"},{"id":"Zigbee node id","type":"Zigbee node id"}],"parametervalues":[{"id":"Communication type","value":"Zigbee"}]}
],
"systems":[
    {"id":"system 2","services":[{"serviceType":"Room controller","id":"servis 1"}],"serviceRelations":[{"serviceName":"servis 1","featureName":"Binary sensor"}],"parametervalues":[{"id":"Delay","paramName":"Delay","serviceType":"Room controller","value":"binary"}]},
    {"id":"system 3","services":[{"serviceType":"Room controller","id":"servis 1"}],"serviceRelations":[{"serviceName":"servis 1","featureName":"Binary sensor"}],"katid":"7"}
]
}

The problem is this. If the browser console is open then my code is running succesfully and I can import the json data to my mongodb. But if browser console is closed I'm getting the "SyntaxError: Unexpected end of JSON input" error.

This is the function that I'm using on the import button

class FileUpload extends Component {
state = {
    warning: ""
}

uploadFile = (files, rejectedFiles) => {
    files.forEach(file => {
        const reader = new FileReader();

        reader.readAsBinaryString(file);
        let fileContent = reader.result;

        axios.post('http://localhost:3001/backendUrl', JSON.parse(fileContent),
            {
                headers: { 
                    "Content-Type": "application/json" 
                }
            })
            .then(response => {
                this.setState({warning: "Succeed"})
            })
            .catch(err => {
                console.log(err)
            });
    });
}

render() {
    return (
        <div>
            <Dropzone className="ignore" onDrop={this.uploadFile}>{this.props.children}
            </Dropzone>
            {this.state.warning ? <label style={{color: 'red'}}>{this.state.warning}</label> : null}
        </div>
    )
}

}

What is that I am doing something wrong or what causes this? Can you help me?

Thank you

Cansel Muti
  • 598
  • 2
  • 9
  • 22
  • Possible duplicate? https://stackoverflow.com/questions/43362431/uncaught-in-promise-syntaxerror-unexpected-end-of-json-input – Paolo Guerra Jul 30 '18 at 13:49

1 Answers1

0

FileReader reads files asynchronously so you have to use a callback to access the results
I would use readAsText instead of readAsBinaryString in case there are non ascii characters in the JSON
Finally, JSON.parse converts a JSON string to an object(or whatever type it would be). fileContent is already JSON so leave it as is.

    const reader = new FileReader();
    reader.onlooad = (e) => {
        let fileContent = this.result;

        axios.post('http://localhost:3001/backendUrl', fileContent,
        {
            headers: { 
                "Content-Type": "application/json" 
            }
        })
        .then(response => {
            this.setState({warning: "Succeed"})
        })
        .catch(err => {
            console.log(err)
        });
    }
    reader.readAsText(file);
Musa
  • 96,336
  • 17
  • 118
  • 137