2014-07-12 14 views
5

Ich mache ein Wahlsystem, die Abstimmung erfolgt mit einem Link. In meinem index.js bekomme ich die erforderlichen Werte und setze sie in Variablen. Die Variable "type" steht für das Feld in meinem mongodb, das aktualisiert werden muss. Ich habe es in eine Variable geschrieben, weil es darauf ankommt, auf welchen Link geklickt wird.

Jetzt in der $ set-Funktion erfordern sie das db-Feld und einen neuen Wert, für beide verwende ich Variablen, aber meine "Typ" -Variable funktioniert nicht. Und wenn ich zu meinem mongodb gehe, gibt es eine neue Tabelle namens "type". Wie kann das gelöst werden?

router.get('/vote/:Id/:Value/:Type', function(req, res) { 
var db = req.db; 
var id = req.params.Id; 
var type = req.params.Type; 
var value = parseInt(req.params.Value); 
var newValue = value + 1; 
var collection = db.get('games'); 

collection.update(
    {"_id" : id}, 
    {$set: {type: newValue}} 
, function (err, doc) { 
    if (err) { 
     res.send("There was a problem"); 
    } 
    else { 
     res.location("../../../admin"); 
     res.redirect("../../../admin"); 
    } 
}); 

});

+0

Ändern Sie den Namen des Feldtyps in ein beliebiges Wort, einen beliebigen Typ, eine beliebige Zeichenkette, eine beliebige Zahl, einen Satz, usw. Dies sind die Schlüsselwörter für Programmiersprachen und Datenbanken. –

Antwort

4

In JavaScript können Sie keine Variablen als Eigenschaftsnamen in Objektliteralen verwenden, und das ist es, was Sie versuchen zu tun.

Versuchen Sie es:

var a = 'someProperty'; 

var o = {a: 'somePropertyValue'}; 

console.log(o); 

{ a: 'somePropertyValue' } nicht {someProperty:'somePropertyValue} gedruckt wird.

Wenn JavaScript erlaubt Variablen Variablen in Eigenschaftsnamen in Objektliteralnotation zu referenzieren, müsste es nicht abgekürzte Namen loswerden, da diese Mehrdeutigkeiten erzeugen würden. Sollte a als Wert der Eigenschaft verwendet werden oder sollte es der Wert der Variablen a sein?

Versuchen Sie das Update Objektliteral mit einem Objekt crated vorher ohne die Verwendung von Objektliteral Notation erstellen, so dass Ihr Code sieht etwa so aus:

router.get('/vote/:Id/:Value/:Type', function(req, res) { 
    var db = req.db; 
    var id = req.params.Id; 
    var type = req.params.Type; 
    var value = parseInt(req.params.Value); 
    var newValue = value + 1; 
    var collection = db.get('games'); 

    //We create the $set property/value pair using property assignment, not the object literal 
    var updateVal = {}; 
    updateVal[type] = newValue; 

    collection.update(
     {"_id" : id}, 
     {$set: updateVal} //use it here 
     , function (err, doc) { 
      if (err) { 
       res.send("There was a problem"); 
      } 
      else { 
       res.location("../../../admin"); 
       res.redirect("../../../admin"); 
      } 
     } 
    ); 
}); 

noch besser, bauen den ganzen vorher $set Betrieb.

+0

Es funktioniert, vielen Dank! –