2013-03-04 11 views
13

Tamam Bu yüzden, aşağıdaki gibi yapılandırmayla burada oluşturulmuş basit bir node.js/express.js/mongodb uygulamasına sahibim. Ben PUT veya DELETE isteklerini yapmaya çalıştığınızdaExpress, PUT/DELETE yöntemini gerçekleştiremiyor. Neyin yanlış gidiyor?

var express = require('express'), 
    mongoose = require('mongoose'); 
    http = require('http'); 

var app = express(); 

    app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 

    //middleware stack 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + "/public")); 
}); 

mongoose.connect("mongodb://localhost/hello"); 

sorun yatıyor. Benim formu

app.put('/users/:name', function(req, res) { 

    var b = req.body; 

    Users.update(
     { name: req.user.name }, 
     { name: b.name, age: b.age, email: b.email }, 
     function(err) { 
      res.redirect('/users/'+b.name); 
     }); 
}) 

yapamıyor zaman basitçe olsun, isteği "PUT Can not" veya "SİLEMİYOR() metodu bu basit

<form method="POST" action="https://stackoverflow.com/users/#{user.name}"> 
    <input type="hidden" name="_method" value="PUT"/> 
</form> 

Şimdi benim yönlendirici ekspres .put ile rota yakalar olduğunu " hata.

Aynı isteği aynı işlemle RESTful istemci aracılığıyla aynı isteği yapmaya çalıştım.

Bir konu okudum cadı, benim de aynı soruna sahip ben yorumlarıma rağmen cevaplarımı çözmeme rağmen problemimi çözmedim.

Sorular Birkaç diğerleri ile birlikte expressjs support for method delete and put without the methodoverride

Are the PUT, DELETE, HEAD, etc methods available in most web browsers?

içine baktık. Ayrıca, birkaç kez express.js ve Mongo belgelerine başvurdum. Sadece neyin yanlış gidebileceğini düşünemiyorum.

Herhangi bir yardım için teşekkür ederiz. Jonathan Lonowski belirttiği gibi benim eski cevabı görmezden böylece

+1

Buna bir çözüm buldunuz mu? Ben aynı şey üzerinde çalışıyorum ve DELETE gitmek için görünmüyor olabilir. – Mike

+0

Bu konuda ne yaptın? Aynı sorunu yaşıyorum - http://stackoverflow.com/questions/17603372/express-rest-server-losing-payload-from-ember-data-put –

+1

@Mike Kabul ettiğim çözüm aşağıda. –

cevap

9

Güncelleme

PUT da kullanılabilir. Cannot PUT veya Cannot POST hatalarını yakalamak, geri bildiriminizin başarıyla yürütülmediğini gösterir. Tahminimce Users.update başarısız oluyor, bu yüzden POST veya PUT yapamıyor. Kontrol edebilir misin.

Eski cevap

bu satırı değiştirmeyi deneyin

app.put('/users/:name', function(req, res) { 

formu

+1

Doğru iken, bu metodOverride'nin noktasıdır. – loganfsmyth

+1

HTML formunun yalnızca iki geçerli yöntemi vardır GET ve POST. – user568109

+0

Bunu denedim ve bir "Cannot POST" hatası ile sonuçlanır. –

3

göndermek için çalışıyoruz beri

app.post('/users/:name', function(req, res) { 

için <form> bir listelenen mı görünüm veya altındadosya? Statik bir dosya içinde

, #{user.name} muhtemelen user 'ın name ve URL Fragment olarak işlem görecektir değiştirilmektedir değildir.

<form> aslında /users/ ziyade bu yana /users/:name sunacağı var path:

action ihtiyaçlar dinamik ve veri tabanlı olması çünkü değilse <form> bir görünüm elde edilmelidir
console.log(url.parse('/users/#{user.name}')); 

{ hash: '#{user.name}', 
    pathname: '/users/', 
    path: '/users/', 
    href: '/users/#{user.name}' } 

. Jade ile ve user varsayarak locals üyesidir, olurdu: İşyerinde garip sihir vardır

form(method='POST', action='/users/' + user.name) 
    input(type='hidden', name='_method', value='PUT') 
+0

Ben bir yeşim şablonu kullanıyorum, özür dilerim ama bu yanıt olarak gördüğüm gibi adı değiştiriliyor psudo kodudur ama örneğin "PUT KULLANICI ADI OLMAYABİLİR" –

1

sürece, formu bir POST isteği değil, bir PUT yapar. PUT yapmak istiyorsanız, jQuery.ajax işlevini, this answer gibi bir type: 'PUT'10 parametresiyle, bir form işleyicisinden kullanmanızı öneririm, bkz. jQuery.submit. Formun iki kez gönderilmemesi için return false'u unutmayın.

+0

Anlattığım tüm ekspres belgelerinde formumdaki gizli alanla bir PUT isteği elde edebilirsiniz. –

+0

Evet, sihire benziyor :) Referans verebilir misiniz? –

+0

[this] (http://clientexpressjs.com/guide) belgelerin bir kopyasıdır. Bu sürümden beri PUT için doğru yöntemin değişip değişmediğini merak ediyorum. Maalesef bu eğitici listede yer alan bir sürüm yok. Nettutsplus ile ilgili bazı eğiticileri izledim ve bu yöntemi kullandıkları halde, 3.1 sürümünü kullandığım ifade 3.0 sürümünü kullandıklarını belirtmelerine rağmen. –

İlgili konular