# Express readFile vor Response.



## Zeppi (5. Okt 2021)

Moin, ich arbeite noch mit einem Node.js Server mit dem Framework Express. Wenn ich etwas verschicke `app.post()` wird mein `response.send()` vor dem `fs.readFile()` durchgeführt. Aber ich verstehe nicht recht wieso. Ich sehe das nämlich, wenn ich console.log(json) unter `readFile` und über `response.send()`schreibe, dort bekomme ich dann undefined. Wenn ich `console.log(json)` innerhalb `readFile` schreibe, bekomme ich eine undefined und dann mein json zurück in der Konsole (undefined kommt durch `response.send()` mir wird auch die Zeile davon angezeigt. 
Wie kann ich es jetzt schaffen, dass mein `response.send` das `json` lesen kann, nachdem readFile durchgelaufen ist.
[CODE lang="java" title="Server"]app.post("/a", (request, response) => {
    var json;
    fs.readFile('input-json.json', (err, data) => {
        if (err) throw err;
        json = JSON.parse(data);
        console.log(json)
    });

    response.send(json)
    }[/CODE]


----------



## Oneixee5 (5. Okt 2021)

`readFile` blockiert nicht den Programmfluss, das Programm wird einfach fortgesetzt. Du könnest es mit `readFileSync` versuchen. Am elegantesten wäre, bei dem sichtbaren Code, die Verwendung von Streams.


----------



## Zeppi (5. Okt 2021)

Oneixee5 hat gesagt.:


> `readFile` blockiert nicht den Programmfluss, das Programm wird einfach fortgesetzt. Du könnest es mit `readFileSync` versuchen.


`readFileSync` bringt bei mir keinen Unterschied, weiterhin bekomme ich undefined. 


> Am elegantesten wäre, bei dem sichtbaren Code, die Verwendung von Streams.


Ich muss mir dann wohl erstmal angucken, was Streams sind. Habe davon noch nichts gehört.


----------



## Oneixee5 (5. Okt 2021)

Ich würde es mal so versuchen. Leider kann ich es gerade nicht selbst testen.

```
app.get('/download', function(req, res) {
  const file = `${__dirname}/.../input-json.json`;
  res.download(file); // Set disposition and send it.
});
```


----------



## Zeppi (5. Okt 2021)

Oneixee5 hat gesagt.:


> ```
> app.get('/download', function(req, res) {
> const file = `${__dirname}/.../input-json.json`;
> res.download(file); // Set disposition and send it.
> ...


Bringt leider nicht den erhofften Unterschied, aber danke.


----------



## mrBrown (5. Okt 2021)

res.download stellt eine Datei zum Download bereit, das ist vermutlich nicht ganz das, was du möchtest.



Zeppi hat gesagt.:


> `readFileSync` bringt bei mir keinen Unterschied, weiterhin bekomme ich undefined.


An welcher Stelle bekommst ist was undefined? `readFileSync` kann afaik nicht undefined zurückgeben, und was anderes hast du da ja nicht...


----------



## Zeppi (6. Okt 2021)

mrBrown hat gesagt.:


> res.download stellt eine Datei zum Download bereit, das ist vermutlich nicht ganz das, was du möchtest.


Das stimmt.


> An welcher Stelle bekommst ist was undefined?  readFileSync kann afaik nicht undefined zurückgeben, und was anderes hast du da ja nicht...


Wenn ich `readFile` ohne sync versuche und console.log in den geschweiften Klammern von `readFile`, bekomme ich mein richtiges json aus dem Ablauf von `readFile` zurück. Wenn ich console.log nach den geschweiften Klammern von `readFile` und vor `response.send` habe, bekomme ich undefined.
Bei `readFileSync` bekomme ich gar nichts zurück, wenn console.log in den geschweiften Klammern steht. Bei außerhalb und vor `response.send`bekomme ich undefined.


----------



## Oneixee5 (6. Okt 2021)

readFile und readFileSync haben eine unterschiedliche Syntax. Das hat nichts mit Klammern zu tun.

```
const fs = require('fs')
try {
  const data = fs.readFileSync('/.../.../input-json.json', 'utf8')
  console.log(data)
} catch (err) {
  console.error(err)
}
```
Ein Blick in die Doku könnte da helfen.


----------

