florian86
Goto Top

Http Request auf Node.js Datei

Hallo Zusammen,

wie kann ich eine auf einem Node.js Webserver liegende Scriptdatei ausführen.

Das Heißt ich habe meine index.html und dort soll per Button eine bestimmte Scriptdatei auf dem Server ausgeführt werden.

Diese Scriptdatei schreibt einfach nur Daten aus einer Datenbank in eine JSON-Datei, welche ich dann wiederum über den Browser abrufen kann.

Wenn ich einen Http Request auf diese Datei mache bekomme ich ja nur den Inhalt als String oder XML ausgeben.

Wie kann ich nun diese Datei anstoßen? Das Script an sich funktioniert wenn ich es auf dem Server in der Console ausführe.

MfG

Florian86

Content-Key: 1255971887

Url: https://administrator.de/contentid/1255971887

Printed on: April 18, 2024 at 14:04 o'clock

Member: wiesi200
wiesi200 Sep 13, 2021 updated at 12:43:25 (UTC)
Goto Top
Hallo,

mit PHP, Javascript, ASP.net

so ziemlich alles was nicht statisch ist.
Also reines HTML funktioniert so ziemlich als einziges nicht.
Member: Florian86
Florian86 Sep 13, 2021 at 12:49:34 (UTC)
Goto Top
Hallo,

naja das ist mir schon klar aber wie genau mache ich das aus Javascript heraus.

Wie gesagt ich habe einen Node.js Webserver. Auf diesem liegt eine Sap.js welche auf SAP zugreift und Daten
auslesen soll.

Wie Stoße ich diese SAP.js jetzt Clientseitig mit Javascript an, dass diese ausgeführt wird.
Member: colinardo
colinardo Sep 13, 2021 updated at 13:13:58 (UTC)
Goto Top
Servus.
// sap.js
// ========
module.exports = {
  foo: function () {
    // whatever you do here
    return somedata;
  },
  bar: function () {
    // whatever you do here
    return otherdata;
  }
};

// main code
// ...
// load module
var sap = require('./sap');  
// execute some functions of external module
var data1 = sap.foo();
var data2 = sap.bar();
Grüße Uwe
Member: Florian86
Florian86 Sep 14, 2021 at 05:11:45 (UTC)
Goto Top
Hallo Colinardo,

ich habe mich vlt. etwas missverständlich ausgedrückt. Ich möchte über meine HTML Seite einen Button klicken welcher
die sap.js serverseitig ausführt.

Wenn ich das so mache wie du sagst bekomme ich die Meldung das Require im Javascript Kontext nicht definiert ist.
Über einen HTTP Request kann man ja mit dem Server Daten austauschen. Aber kann ich damit auch meine sap.js ausführen?

ich habe also eine aufruf.js die in meine HTML eingebunden ist.

<script type="text/javascript" src="./aufruf.js"></script>  

In der aufruf.js soll dann so etwas stehen...

function display(some){

    //var obj = JSON.parse(some);

    document.getElementById("txt").innerHTML = some;  
 
}

function getFile(mycallback){

        let http = new XMLHttpRequest();

        http.open('GET','sap.js');  
        http.onload = function(){
            if(http.status == 200){
                mycallback(this.response);
                //display(this.response);
                
            }
            else {
                mycallback("Error" + http.status);          
            }        
        }
        http.send();
}

getFile(display);

Leider bekomme ich so ja immer nur den Text der sap.js also den Inhalt zurückgegeben.

Wie kann ich jetzt die sap.js über meine HTML ausführen?

MfG

Florian86
Member: Florian86
Florian86 Sep 14, 2021 at 06:01:23 (UTC)
Goto Top
das ist die Node.js Webserver Datei dazu...
const http = require("http");  
const path = require("path");  
const express = require("express");  

const clientDirectory = path.join(__dirname, "./");  
const app = express();

app.use('/',express.static(clientDirectory));  

app.listen(8080, () =>{
  console.log('Server is listening on port 8080.')  
})
Member: wiesi200
wiesi200 Sep 14, 2021 at 06:07:20 (UTC)
Goto Top
Hallo,

mit gefällt da auf die schnelle die Zeile nicht
 http.open('GET','sap.js');  

wenn dann eher
http.open('GET', 'http://serverip:8080/sap.js');  

Teste einfach mal den node.js per Webbrowser aufrufen. Da musst du die richtigen Daten bekommen.
Und genau so muss das per JavaScript über den Webseite aufgerufen werden.
Member: godlie
godlie Sep 14, 2021 at 06:08:58 (UTC)
Goto Top
Hallo,

das was du suchst ist ein ajaxCall auf die URL vom Webserver, diesen führst du auf onClick bei deinem Button aus.

https://www.w3schools.com/js/js_ajax_intro.asp
Member: Florian86
Florian86 Sep 14, 2021, updated at Apr 21, 2022 at 15:01:51 (UTC)
Goto Top
Hallo,

Ich habe beides versucht und bekomme immer den Klartext der sap.js zurückgegeben...

sapjs

Letztendlich soll die sap.js ausgeführt werden und mir eine json Datei füllen. Führe ich diese über die Console aus
funktioniert diese auch.
Member: colinardo
colinardo Sep 14, 2021 updated at 06:37:23 (UTC)
Goto Top
Zitat von @Florian86:

Hallo Colinardo,

ich habe mich vlt. etwas missverständlich ausgedrückt. Ich möchte über meine HTML Seite einen Button klicken welcher
die sap.js serverseitig ausführt.
Ich habe dich schon verstanden, du aber offensichtlich nicht ganz. face-smile
Wenn ich das so mache wie du sagst bekomme ich die Meldung das Require im Javascript Kontext nicht definiert ist.
Ist ja auch logisch denn der zweite Code von mir oben gehört in den Server-Teil muss also auf dem Server ausgeführt werden und nicht auf dem Client!! Es ist ja ein wesentlicher Unterschied zwischen Client- und Server-JavaScript.

app.use('/',express.static(clientDirectory));

Damit lieferst nur jede Datei "statisch" aus so kann das nie was werden. Also im Server die Funktionen der sap.js ausführen lassen und den Server dynamisch das Ergebnis ausliefern lassen.

Der Ablauf ist folgender:
  • Server liefert HTML aus
  • Client führt Clientseitiges JavaScript aus das eine Aktion auf derm Server triggert (Aufruf einer speziellen URL via Ajax)
  • Server reagiert auf diese spezielle URL mit einem serverseitigen Aufruf deiner SAP Funktionen wie oben gezeigt und liefert das Ergebnis als HTML aus.
  • Client JavaScript verarbeitet die vom Server zurückgelieferten Daten und setzt es in das HTML Element.
Member: godlie
godlie Sep 14, 2021 at 06:34:01 (UTC)
Goto Top
Hallo,

dir ist aber schon klar das auf dem "Server" die app.js per "node app.js" laufen muss damit du vom "Client" mit o.g. Methoden zugreifen kannst? die app.js über einen Webserver zu Providen wid nicht gelingen...

https://developer.mozilla.org/de/docs/Learn/Server-side/Express_Nodejs
Member: colinardo
Solution colinardo Sep 14, 2021 updated at 07:19:57 (UTC)
Goto Top
Hier mal ein ganz einfaches Beispiel (erweitertes Errorhandling etc. weg gelassen) das du so ausprobieren kannst ohne jetzt explizit die express library zu verwenden damit du verstehst was im Hintergrund abläuft. Das Beispiel inkludiert den HTML-Code der Einfachheit halber im Node Code (macht man natürlich normalerweise nicht, ist nur für das Beipiel).

Zum Testen die index.html des Servers aufrufen: http:/server:8000/index.html.

Server-Code
const http = require("http");  
const url = require("url");  
const host = "0.0.0.0";  
const port = 8000;
// include sap.js server side javascript functions
var sap = require('./sap');  

// main listener function
const requestListener = function (req,res){
	const location = url.parse(req.url,true);
	switch(location.pathname){
                // base page
		case "/index.html":  
			res.statusCode = 200;
			res.setHeader("Content-Type","text/html");  
			let html = `
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
<title>My Test</title>
</head>
<body>
<script type="text/javascript">  
function display(some){
    document.getElementById("txt").innerHTML = some;  
}
function getFile(mycallback){
        let http = new XMLHttpRequest();
        http.open('GET','/sap.js');  
        http.onload = function(){
            if(http.status == 200){
                mycallback(this.response);
            }else {
                mycallback("Error" + http.status);          
            }        
        }
        http.send();
}
</script>
	
	<button type="button" onclick="getFile(display);">Trigger SAP function</button>  
	<div id="txt"></div>  
</body>
</html> 
			`;
			res.end(html);
			break;
		
                // called when sap.js is opened by a client request
		case "/sap.js":  
			res.statusCode = 200;
			res.setHeader("Content-Type","text/html");  
			let result = sap.get_sap_data();
			res.end(result);
                        break;
                
                // everything else => 404
		default:
			res.statusCode = 404;
			res.end();
	}
};

// create server with listener callback
const server = http.createServer(requestListener);
server.listen(port,host, () => {
	console.log(("Server is running on '" + host + "' Port '" + port + "'"));  
});

sap.js
// functions which are exposed to public when "required" in other file 
module.exports = {
	get_sap_data : function(){
                // your database code here
		return "<strong>Some test data from database</strong>";  
	}
};

Denke das sollte deinen Knoten nun etwas lösen. Und wie immer ist die Dokumentation dein Freund und Helfer.

Grüße Uwe
Member: Florian86
Florian86 Sep 14, 2021 at 07:54:08 (UTC)
Goto Top
danke ich versuch mich mal damit

MfG

Florian86
Member: Florian86
Florian86 Sep 16, 2021 at 06:50:41 (UTC)
Goto Top
Danke für eure Hilfe, jetzt klappts dann auch mit express.

MfG

Florian86