2013-03-04 50 views
13

好吧所以我有一個簡單的node.js/express.js/mongodb應用程序設置在這裏與我的配置如下。 表示不能使用PUT/DELETE方法。出了什麼問題?

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"); 

問題在於,當我試圖讓PUT或DELETE請求。我的形式是這樣的簡單的現在

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

我的路由器捕捉與表達。把路線()方法

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); 
     }); 
}) 

當我做,我只是得到了請求「不能把」或「無法刪除「錯誤。

我試圖通過chomes RESTful客戶端做出同樣的請求,結果相同。

我讀過一個主題女巫與我有同樣的問題,雖然下面的評論答案並沒有解決我的問題。

問題我已經調查 expressjs support for method delete and put without the methodoverride

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

隨着其他幾個人。 我也多次引用了express.js和mongo文檔。 我只是不能認爲會出現什麼問題。

任何幫助表示讚賞。

+1

你有沒有找到解決方案?我正在做同樣的事情,似乎無法讓DELETE通過。 – Mike 2013-05-31 14:23:05

+0

你最終做了什麼?我有同樣的問題 - http://stackoverflow.com/questions/17603372/express-rest-server-losing-payload-from-ember-data-put – 2013-07-15 12:26:17

+1

@Mike我接受的解決方案如下。 – 2013-07-15 22:31:53

回答

9

更新

喬納森Lonowski指出PUT也可以使用,所以你可以忽略我的舊的答案。 獲取Cannot PUTCannot POST錯誤,表示您的回調未成功執行。我的猜測是Users.update失敗,這就是爲什麼它不能POST或PUT。你可以檢查它。

老答案

嘗試改變這一行

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

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

,因爲您要提交表單

+1

儘管如此,這是'methodOverride'的一點。 – loganfsmyth 2013-03-04 04:24:02

+1

HTML表單只有兩個有效的方法GET和POST。 – user568109 2013-03-04 04:44:07

+0

我試過這個,並導致「無法POST」錯誤。 – 2013-03-04 04:51:10

3

是在<form>你在一個上市查看或static檔案在__dirname + "/public"

在靜態文件中,#{user.name}可能不會被替換爲username,並且將被視爲URL Fragment

<form>實際上將提交給/users/,而不是因爲這/users/:name年代path

console.log(url.parse('/users/#{user.name}')); 

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

<form>應該從視圖中產生的,如果它不是,因爲action需求是動態的,數據驅動。玉和假設userlocals一員,這將是:

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

我正在使用一個玉模板,我道歉,但這是psudo代碼名稱正在被替換,因爲我在響應中看到它,但它會例如「不能PUT USERNAME」 – 2013-03-04 04:52:19

1

除非有工作魔法怪,你的形式使POST請求,而不是一個PUT。如果你想PUT,我建議使用jQuery.ajax函數,type: 'PUT'參數,如this answer,從表單處理函數,請參閱jQuery.submit。不要忘記return false,以便表單不會提交兩次。

+0

在所有的快遞文檔中,我已閱讀它們暗示您可以通過我的表單中的隱藏字段來實現PUT請求。 – 2013-03-04 04:53:05

+0

是的,這聽起來像魔術:)你能提供一個參考? – 2013-03-04 05:00:23

+0

[this](http://clientexpressjs.com/guide)是來自文檔的副本。我想知道從這個版本開始,PUT的正確方法是否已經改變。不幸的是,該教程沒有列出任何版本。 我一直在看關於nettutsplus的一些教程,他們使用這個相同的方法,雖然在他們的文檔中他們聲明他們使用3.1版本的Express。 – 2013-03-04 06:00:07