2016-07-11 27 views
1

Verwenden der aktuellen Version von MassiveJS und Express für API-Aufrufe. Wenn die SAVE-Funktion Massive will eine Liste von Spaltennamen zu aktualisieren, wie folgt:Verwenden von MassiveJS für REST Put/Post speichert

router.put('/:id', function(req, res, next) { 
    db.suppliers.save(
    { 
     id: +req.params.id, 
     name: req.body.name, 
     email: req.body.email, 
     column1: req.body.column1, 
     column2: req.body.column2, 
     column3: req.body.column3, 
     manyOtherColumns: req.body.manyOtherColumns, 
     etc... 
    }, function (err, result) { 
     if (err) { 
     return next(err); 
     } 
     return res.status(200).json({ 
     status: 'SUCCESS', 
     message: 'Supplier has been saved' 
     }); 
    }) 
}); 

Wie Sie sehen können, wie die Spaltenliste länger und immer länger, dieser Code schwieriger wird, zu halten. Daher habe ich mich gefragt, ob es eine Möglichkeit gibt, den gesamten req.body in einem einzigen Aufruf zu speichern, vorausgesetzt, die req.body-Schlüsselwerte stimmen mit den db-Spaltennamen überein. Das würde viel Zeit sparen und viel wartbarer sein.

+0

Sind Sie vertraut mit Überbuchung? So kann ein böswilliger Benutzer beispielsweise admin: true setzen. Ich empfehle Ihnen, Ihre Formular-Posts aufzulisten. –

+0

Ich bin nicht mit Überbuchung/White Listing vertraut. In all den Trainingsbeispielen, die das Senden von Formularen mit REST demonstrieren, werden diese Konzepte nicht erwähnt. Eine Google-Suche erzeugt verwirrende Antworten und keine klare Vorgehensweise in meinem Szenario - MassiveJS und Express/Express.Router(). Nun, Sie haben meine Neugier und Frustration, dass es noch eine weitere Ebene der Komplexität gibt, die auf etwas angewendet werden muss, das so einfach ist, wie Daten in einem db-Backend zu veröffentlichen. Gibt es etwas, das Sie mir zur Verfügung stellen können, um dies zu verstehen, insbesondere, wenn es um Ihre Lösung, Massive, geht? – CCPony

+0

Rob - Ich glaube, dass Sie sich auf etwas beziehen, das diesem Beitrag ähnlich ist: http://stackoverflow.com/questions/28701258/mysql-whitelist-query. Das verstehe ich vollständig und habe Sicherheitsvorkehrungen getroffen, um böswillige Posts zu verhindern und sicherzustellen, dass Benutzer nur autorisierte Daten haben und nur autorisierte Personen veröffentlichen können. Ich kannte den Begriff "Whitelist" einfach nicht. Bezieht sich das irgendwie auf meine ursprüngliche Frage bezüglich des Problems der Langeweile und Wartung, Dutzende von Spalten bei der Verwendung von Massive.save() aufzulisten? Gibt es einen besseren Weg, das zu tun? – CCPony

Antwort

2

Massive ist kein ORM, also ist das Speichern eines "Objekts" nicht die Idee. Wenn Sie etwas aktualisieren möchten, können Sie dies direkt mit db.update tun und die Werte, die Sie aktualisieren möchten, sowie die ID der Zeile übergeben. Dies wird eine teilweise Aktualisierung für Sie tun.

Wie ich in den Kommentaren erwähnt habe, ist es wahrscheinlich keine gute Idee, einen REST-Endpunkt zu öffnen, um zu aktualisieren, was ein Benutzer über POST einleitet, selbst wenn Sie Ihrem Benutzer vertrauen.

Schließlich: Wenn Sie nur an der Form-Post übergeben wollen Sie:

router.put('/:id', function(req, res, next) { 
    var supplier = { 
    id: req.params.id; 
    }; 
    supplier = _.extend(supplier, req.params.body); 
    db.suppliers.save(
    supplier 
    , function (err, result) { 
     if (err) { 
     return next(err); 
     } 
     return res.status(200).json({ 
     status: 'SUCCESS', 
     message: 'Supplier has been saved' 
     }); 
    }) 
}); 
+0

Wow. Das ist neu für mich. Ich bemühe mich zu verstehen. Es scheint, dass Sie mir sagen, dass die Veröffentlichung mit einem "Active Record" -Muster (das den Zugriff auf alle Tabellenspalten ermöglicht) das Potenzial für einen Masseneinsatz-Angriff schafft. Und wenn ich Sie richtig verstehe, indem ich die Spalten aufliste, die der POST aktualisiert, vermeidet dies einen solchen Angriff. Ist es das, was Sie als White-Listing eines Formularposts bezeichnen? – CCPony