florian86
Goto Top

Node.js POST Verarbeitung

Hallo Zusammen,

ich möchte Daten an meinen Node.js Express Server senden und mir in der Console ausgeben lassen.
Das senden funktioniert soweit...

'use strict';  

document.getElementById("anzeige").addEventListener("click",function(){  

    let data =  [{
        "material" : "60089",  
        "lagerort" : "2000",  
        "mhd" : "24"  
    }]


    getFile('/zwmbestand',data,function(sap){  
       
    });

});

function getFile(uri,data,mycallback){
 
    let http = new XMLHttpRequest();

    http.open('POST',uri);  
    http.setRequestHeader('Content-Type', 'application/json');  
    http.onload = function(){
        if(http.status == 200){
                mycallback(this.response) 
        }
        else {
            console.log("Error" + http.status);          
        }        
    }
    http.send(JSON.stringify(data));
};

Ich bekomme aber irgendwie immer undefined ausgegeben.

"use strict";  

const express = require('express');  
const fs = require('fs');  

const app = express();

app.post('/zwmbestand',(req,res,next) => {  
               
    console.log(req.body);                                                                      
   res.send("erledigt");   
});

Ich hoffe es ist nur ein kleines Problem face-smile

MfG

Scheufler

Content-ID: 6288375032

Url: https://administrator.de/forum/node-js-post-verarbeitung-6288375032.html

Ausgedruckt am: 23.12.2024 um 12:12 Uhr

darby1337
darby1337 09.03.2023 um 13:54:12 Uhr
Goto Top
Hi,

NodeJS kann standardmäßig nicht selbst auf den body eines Express-Request objektes zugreifen. Dafür musst du noch den body-parser installieren.

npm i body-parser

Diesen musst du dann noch deinem Server übergeben:
const bodyparser = require('body-parser');  
app.use(bodyparser.urlencoded({extended: true}));

Damit solltest du dann auch auf den Inhalt des bodys zugreifen können.
Florian86
Florian86 09.03.2023 aktualisiert um 14:22:58 Uhr
Goto Top
Hi,

Danke für die schnelle Info. Statt mein undefined bekomme ich nun die geschweiften klammern
Server is running on Port 8080
{}

als Payload wird mir aber der String angezeigt...

[{"material":"60089","lagerort":"2000","mhd":"24"}]
Florian86
Lösung Florian86 09.03.2023 aktualisiert um 14:35:50 Uhr
Goto Top
ah ich habe es...

mein Header stand noch auf application/json. Nach der Änderung auf...
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
funktioniert es.

bzw. dann mit
app.use(bodyparser.json())
auch mit application.json


Danke für deine Hilfe
darby1337
darby1337 09.03.2023 um 14:53:31 Uhr
Goto Top
Zitat von @Florian86:

ah ich habe es...

mein Header stand noch auf application/json. Nach der Änderung auf...
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
funktioniert es.

bzw. dann mit
app.use(bodyparser.json())
auch mit application.json


Danke für deine Hilfe

Ja stimmt, hatte ganz vergessen zu erwähnen das wenn du JSON nutzt noch
app.use(bodyparser.json());
genutzt werden muss.

Aber freut mich das es klappt face-smile
Florian86
Florian86 10.03.2023 um 09:03:23 Uhr
Goto Top
Ja Danke vielmals... Ich habe den XMLHTTPREQUEST nun noch vereinfacht und nutze async/await mit fetch

    const options = {
        method: 'POST',  
        headers:{ 'Content-Type': 'application/json' },  
        body:JSON.stringify(data)
    };

async function postfile(options){
    const response = await fetch('/zwmbestand',options);  
    const data = await response.json();

Das funktioniert auch soweit nur habe ich so dasselbe Problem wie bei der XMLRequest Variante, dass beim ersten mal klicken immer noch der alte Wert geladen wird. Erst beim zweiten Click kommt das richtige Ergebnis.

Es wird ja asyncron ausgeführt aber ich dachte wenn ich mit await arbeite müsste es doch funktionieren.

LG

Florian
darby1337
Lösung darby1337 10.03.2023 aktualisiert um 10:44:07 Uhr
Goto Top
Diese Request kommt aus dem JS, welches auf der Seite ausgeführt wird? Oder ist das vom Express?

Habe das mal bei mir selbst aufgesetzt und getestet. Soweit beim testen funktioniert alles. Hier der Code, welchen ich in der Browser-Konsole ausführe:
'use strict';  

async function postData() {
  const exampleData = {
    user: 'test',  
    isAdmin: true,
  };

  const rOptions = {
    method: 'POST',  
    headers: {
      'Content-Type': 'application/json',  
    },
    body: JSON.stringify(exampleData),
  };

  const response = await fetch('http://localhost:3000/zwmbestand', rOptions);  
  const data = await response.json();
  return data;
}

(function () {
  postData()
    .then(data => console.log(data))
    .catch(error => console.error(error));
})();

Und hier mein Express-Server:
// Import
const bodyParser = require('body-parser');  
const server = require('express')();  
const cors = require('cors');  

// Use middlewares
server.use(bodyParser.urlencoded({extended: true}));
server.use(bodyParser.json());
server.use(cors());

// POST
server.post('/zwmbestand', async (req, res) => {  
  console.log(req.body);
  res.json({success: true, message: 'works'});  
});

// Start
server.listen(3000, () => {
  console.log('Express server running on port 3000');  
});

Als Ergebnis bekomme ich in der Browser-Konsole den JSON-String "{success: true, message: 'works'}" angezeigt. In meiner Express-Konsole wird mir der Request-Body angezeigt mit den Daten. Ich nutze hier noch die CORS-Middleware, da die Anfrage aus dem Browser sonst nicht an den Express-Server durchgeht.

//Edit
Habe auch mal noch geschaut, ob der Express-Server auch alte Daten anzeigt und habe das Skript unterschiedlichen usernamen ausgeführt. Bei allen drei Versuchen kam auch im Express der jeweils neuste Datensatz mit.
Florian86
Florian86 10.03.2023 um 13:27:20 Uhr
Goto Top
Danke. Ich hatte nicht auf der Serverseite gewartet... nun geht es