Forum: PC-Programmierung Syntax verstehen mal wieder (sql, javascript)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Aua (Gast)


Lesenswert?

Ich arbeite mich gerade an diesem Tutorial ab:

https://bezkoder.com/node-js-rest-api-express-mysql/

Dabei fällt es mir schwer, zu verstehen, wie das Fragezeichen hier in 
dem sql-statement funktioniert - also woher weiß man / wie kann man 
nachlesen, was genau für das Fragezeichen eingesetzt wird; also wie dann 
das "fertige" Insert-into-Statement aussieht?
1
Customer.create = (newCustomer, result) => {
2
  sql.query("INSERT INTO customers SET ?", newCustomer, (err, res) => {
3
    if (err) {
4
      console.log("error: ", err);
5
      result(err, null);
6
      return;
7
    }
8
...

von Εrnst B. (ernst)


Lesenswert?

Aua schrieb:
> wie kann man
> nachlesen

https://dev.mysql.com/doc/refman/8.0/en/insert.html

-> das insert ... set nimmt eine "assignment list", also eine Liste von 
zuweisungen wie "Vorname=Franz, Nachname=Aua, ..."

Wie das "newCustomer" - Objekt da hineingepresst wird, steht z.B. hier:
https://www.npmjs.com/package/mysql#escaping-query-values
1
- Objects that have a toSqlString method will have .toSqlString() called and the returned value is used as the raw SQL.
2
- Objects are turned into key = 'val' pairs for each enumerable property on the object. If the property's value is a function, it is skipped; if the property's value is an object, toString() is called on it and the returned value is used.
--> entweder hat dein Customer eine "toSqlString"-Methode, oder es wird 
drüberiteriert und key=value Paare gebildet.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Aua schrieb:
> wie kann man nachlesen

Wie wäre es damit einfach mal in der Beschreibung der von dir 
verwendeten Datenbank nachzuschauen?

z.B. https://dev.mysql.com/doc/refman/8.0/en/insert.html

von Aua (Gast)


Lesenswert?

Εrnst B. schrieb:
> Wie das "newCustomer" - Objekt da hineingepresst wird, steht z.B. hier:
> https://www.npmjs.com/package/mysql#escaping-query-values

Danke! (da wird das mit dem Fragezeichen erklärt)

von Aua (Gast)


Lesenswert?

ok, jetzt fehlt mir noch etwas zum Verständnis, gleiches Tutorial: In 
customer.model.js lautet die letzte Zeile:

module.exports = Customer;

Was macht die Zeile, und was ist dieses "exports", das im weiteren 
Verlauf verwendet wird?

von Aua (Gast)


Lesenswert?

ah ok ich habs selbst gefunden

von Aua (Gast)


Lesenswert?

Jetzt hatte ich mal wieder etwas Zeit für mein Hobby - aber leider auch 
noch ein Syntax-Verständnisproblem (gleiches Tutorial siehe oben):

Zum einen verstehe ich diese Schreibweise der Funktionen mit dem => 
Pfeil nicht:
1
Customer.create = (newCustomer, result) => {
2
  sql.query("INSERT INTO customers SET ?", newCustomer, (err, res) => {
3
    if (err) {
4
      console.log("error: ", err);
5
      result(err, null);
6
      return;
7
    }
8
9
    console.log("created customer: ", { id: res.insertId, ...newCustomer });
10
    result(null, { id: res.insertId, ...newCustomer });
11
  });
12
};

wie würde man das ohne den => Pfeil schreiben? Ich hab gelesen, dass das 
in den geschweiften Klammern nach dem Pfeil das ist, was die Funktion 
zurückgibt - aber wo wird da was ausgegeben, und was (zum anderen) 
bedeutet dieses "result(err, null);"?

von Εrnst B. (ernst)


Lesenswert?

Aua schrieb:
> wie würde man das ohne den => Pfeil schreiben?

Ein aktuelles Javascript-Buch möchtest du nicht lesen? Oder wenigstens 
ein Grundlagen-Tutorial?

Bis auf einige Eigenheiten z.B. bzgl. "this" ist

(a,b,c)=>{...}
dasselbe wie
function(a,b,c) {...}

Aua schrieb:
> bedeutet dieses "result(err, null);"

"result" ist eine Funktion. Diese nimmt zwei Parameter. Bei Fehler wird 
die Funktion mit parametern "(err, null)" aufgerufen. Im Erfolgsfall mit 
"(null, ergebnis)"

Besonderheit: Welche tatsächliche Funktion sich hinter "result" 
verbirgt, wird erst beim Aufruf von Customer.create mitgeteilt, und kann 
bei jedem create-Aufruf eine andere sein.
Macht man, damit das Programm nicht blockiert ist, während die 
SQL-Anweisung läuft, aber man trotzdem auf deren Beendigung reagieren 
kann.

z.B.

console.log("A");
Customer.create({customerdata},(a,b) => { console.log("customer.create 
fertig",a,b); });
console.log("B");

Gibt aus:

A
B
... auf Datenbank warten ...
customer.create fertig null { id:12345, ...}


d.H. das Programm läuft weiter ("B"), während im Hintergrund die 
Datenbank werkelt

von Aua (Gast)


Lesenswert?

danke, dieses "funktion als Parameter" bzw. als Argument war mir bisher 
fremd. Auch asynchrone callback-Funktionen. Ich lese ja nebenbei / aber 
manchmal ist es schön, wenn man es parallel mit anderen Worten (wie 
hier) erklärt sieht.

von Aua (Gast)


Lesenswert?

.. und was noch schwer für mich ist: zu sehen, welcherart die Daten 
sind, die da hin und her wandern. Wieso z.B. kann man schreiben wie Du 
oben

Customer.create({customerdata},(a,b) => { console.log("customer.create
fertig",a,b); });

was ist dieses {customerdata} ? Ein Objekt? Array? Lose Blattsammlung? 
Wieso die geschweiften Klammern um ein Argument? :-)

Ich habe früher viel VB.net gemacht, da musste das vorher deklariert 
sein (man konnte es so einstellen)

von Εrnst B. (ernst)


Lesenswert?

Aua schrieb:
> was ist dieses {customerdata}

in dem Fall: Ein Gedanklicher Platzhalter, hier sollten deine 
Kundendaten rein. Sinnvoll in dem Kontext ist das so nicht.

Besser:

const customerdata={
  vorname: "Hans",
  nachname: "Huber"
};

Customer.create(customerdata, ...

Oder (sog "spread-Operator")

Customer.create({ ...customerdata }, ...


Nur {customerdata} wäre kurz für
{ customerdata: customerdata }, und in dem Fall nicht das gewünschte.

War also in meinem Beispiel ungünstig und verwirrend gewählt, sorry.

: Bearbeitet durch User
von Aua (Gast)


Lesenswert?

ah gut, danke für die Klarstellung ;-)

von Experte (Gast)


Lesenswert?

Naja, eigentlich ist es ganz einfach, von den geschweiften Klammern wird 
in Javascript heftig Gebrauch gemacht für:

a.) Anonyme Funktionen bzw. Lambda-Funktionen:
1
  const f = (...) => {...}

b.) Objekte, Konstruktion sowie Dekonstruktion:
1
  const obj = {...};  // Objekt-Konstruktion
2
  const {...} = obj;  // Objekt-Dekonstruktion

Dabei gibt es für die Konstruktion sehr praktische Abkürzungen:
1
  const name = "Hans";
2
  const age = 21;
3
  const obj1 = { name: name, age: age };  // Ausführlich, redudant
4
  const obj2 = { name, age };             // Abkürzung

Und Objekt-Dekonstruktion:
1
  const obj = { name: "Hans", age: 21 };
2
  const { name, age } = obj;

Ist das gleiche wie:
1
  const obj = { name: "Hans", age: 21 };
2
  const name = obj.name;
3
  const age = obj.age;


Dabei kann und wird die Objekt-Konstruktion oft als Argument bei einem 
Funktionsaufruf geschrieben, und die Objekt-Dekonstruktion wird als 
Parameter verwendet:
1
  const beispiel = (data, fn) => {
2
    const msg = "Hallo, Welt!"; 
3
    fn({...data, msg});
4
  };
5
6
  const name = "Hans";
7
  const age = 21;
8
  const obj = {name, age};
9
10
  beispiel(obj, ({msg, name, age}) => { 
11
    console.log(msg);
12
    console.log(name, age); 
13
  });

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.