Syntax verstehen mal wieder (sql, javascript)

Gast #6749079
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
...
#6749091
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.
Gast #6749109
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?
Gast #6755517
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);"?
#6755719
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
Gast #6755769
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.
Gast #6755781
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)
#6755830
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.
Gast #6755990
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren