2017-11-05 5 views
-1

Ich benutze Node.js, Express und MethodOverride zu versuchen und haben ein Formular Update nur 1 Teil eines Modells (mein Benutzermodell).MethodOverride PUT funktioniert nicht

User-Modell:

var userSchema = new mongoose.Schema({ 

email: { type: String, unique: true, lowercase: true }, 
    password: String, 

    profile: { 
    name: { type: String, default: 'Company Name' }, 
    location: { type: String, default: 'Location' }, 
    website: { type: String, default: 'Your Website' }, 
    picture: { type: String, default: '' } 
    }, 

    assetNumPre: { type: String, default: 'test' }, // this is the one I want to change 

}); 

module.exports = mongoose.model('User', userSchema); 

HTML-Formular:

<form role="form-inline"action="/dashboard/settings/assetNumber?_method=PUT" method="POST"> 
<div class="col-md-3"> 
    <div class="form-group"> 
    <label for="prefix" class="control-label">Prefix for Asset Number</label> 
    <br> 
    <small>Any alphanumeric characters to a limit of 6</small> 
    <input type="text" class="form-control" id="prefix" name="prefix" placeholder="Prefix max 6 characters" maxlength="6" value="{{ prefix }}"> 
    </div><!-- Prefix for Asset Number--> 
    <br> 
    <div class="box-footer"> 
    <button type="submit" class="btn btn-primary">Submit</button> 
    </div> 
    </div> 
</form> 

Dann Route:

app.put('/dashboard/settings/assetNumber', 
setRender('dashboard/settings/assetNumbers'), 
setRedirect({auth: '/login'}), 
isAuthenticated, 
dashboard.getDefault, 
(req, res) => { 
var prefix = req.body.prefix; 
console.log(req.params); 
User.findByIdAndUpdate({_id: req.params.user_id}, prefix, function(err, UpdatedUser) { 
    if (err) { 
    res.send(err); 
    } 
    console.log(UpdatedUser); 
    }); 
res.locals.prefix = req.user.assetNumPre; 
}); 

Eine Sache, meine Strecke fehlt ist req.user.assetNumPre das ist, wo ich brauche, es zu retten aber ich habe keine Ahnung wie man das macht PUT Anfrage. Docs helfen auch nicht viel.

Ich habe die Route von einem Stack Overflow Beispiel vor ein paar Tagen und kann nicht den Link zu finden. Meine app.js hatte eine Methodenüberschreibung, weil ich bereits DELETE Anfragen bearbeitet habe. Das Modell hat das richtige Feld und einen Standard-Testwert, der auf meiner Show-Seite angezeigt wird.

+0

Was bedeutet "nicht funktioniert"? –

+0

@AndyRay es wurde nicht aktualisiert, ich denke, ich hätte das sagen sollen. Ich habe nicht daran gedacht, es zu tun, da es 'findbyidandupdate' ist. – Kirbytech

Antwort

1

Du nenne dies:

User.findByIdAndUpdate({_id: req.params.user_id}, prefix... 

Aber Präfix ist nur der Wert:

var prefix = req.body.prefix; 

findByIdAndUpdate takes an Object, keinen Wert, ein bestimmtes Feld zu aktualisieren.

So versuchen:

User.findByIdAndUpdate({_id: req.params.user_id}, { assetNumPre: prefix }... 
+0

Danke, ich habe es geschafft, indem ich zu einem alten Code zurückkehrte und ein Beispiel von dort nahm. Ich werde meine neue Route als Antwort posten, aber deins ist die Lösung für mein Problem Ich habe es gerade gesehen, nachdem ich es herausgefunden habe. – Kirbytech

0

Hier ist die feste Route:

app.put('/dashboard/settings/assetNumber', 
    setRedirect({auth: '/login', success: '/dashboard/settings/assetNumber', failure: '/dashboard/settings/assetNumber'}), 
    isAuthenticated, 
    (req, res) => { 
     User.findById(req.user.id, function(err, user) { 
     if (err) return (err); 
     user.assetNumPre = req.body.prefix || 'pre'; 

     user.save(function(err) { 
     if (err) return (err); 
      req.flash('success', { msg: 'Asset Number Prefix updated.' }); 
      res.redirect(req.redirect.success); 
     }); 
    }); 

    res.locals.prefix = req.user.assetNumPre; 
    }); 

So ein paar Dinge geändert, die nicht Teil des Problems war. Ich habe herausgefunden, dass ich nur die Daten innerhalb der Callback-Funktion einstellen muss. Dann machen Sie eine user.save.

Verwandte Themen