2017-07-29 33 views
1

下面的代碼成功刪除當按鈕被點擊並確認記錄:Express是否要求我使用POST路由刪除?

路由器(快遞):

router.post('/meetings/delete/:slug', catchErrors(meetingController.deleteMeeting)); 

控制器:

exports.deleteMeeting = async (req, res) => { 
    const slug = req.params.slug; 
    const meeting = await Meeting.remove({ slug }); 
    req.flash('success', 'meeting successfully deleted!'); 
    res.redirect(`/meetings`); 
}; 

視圖模板(帕格/翡翠):

form.delete-meeting-form(method='POST' action=`/meetings/delete/${meeting.slug}?_method=DELETE`) 
    input.button.button--delete(type='submit' value='DELETE MEETING' onclick='return confirm("Are you sure you want to delete this meeting? (Cannot be undone)")') 

此代碼原樣運行。但是,我似乎很奇怪我似乎需要使用POST路由才能完成我的DELETE請求。當我試圖使用router.delete來形成路線時,它不起作用。

據我所知,HTML並不支持DELETE和PUT/PATCH請求,但爲什麼要將我的Express路由命名爲delete?我做錯什麼了嗎?

+0

express支持基於刪除方法的路由https://expressjs.com/en/starter/basic-routing.html –

+0

謝謝,Arpit。我看到了這一點,但是當我試圖實施它時,我不再碰到控制器。只有當我切換到POST時,它終於工作。 –

+0

與形式和簡單的提交按鈕有沒有辦法可以使用刪除路線,但如果你嘗試ahax它會工作。當你點擊路線時會顯示什麼? 404? –

回答

1

Delete will work fine with express.定期的HTML表單不支持刪除。如果您添加刪除路由到您的應用程序,你可以測試與阿賈克斯(獲取,愛可信,jQuery的,等等)或捲曲的刪除方法:

curl -X "DELETE" http://foo/meetings/some-meeting 

如果您希望能夠使用普通的HTML表單與delete,請查看method-override middlewarecustom logic部分顯示瞭如何創建一個類似於Rails處理方法覆蓋的重寫。

+0

這非常有趣。當我用curl擊中路線時,如你所建議的那樣,控制器成功執行。但如果我使用HTML表單/按鈕嘗試它,它是不成功的。所以問題一定是HTML? –

+0

正確,HTML表單不支持刪除。您可以使用ajax發出刪除請求。 –

+0

Yuck,這很煩人。我知道在Rails模板中它會自動轉換成HTML可以使用的東西。我認爲我上面的代碼(特別是method ='POST'action ='/ meetings/delete/$ {meeting.slug}?_ method = DELETE')可以繞過HTML的限制。顯然不是? –

0

這是一個慣例問題。除了GETPOST之外,jQuery(和Javascript一般)還支持DELPUT,但是正如你在上面所做的那樣,沒有什麼能阻止你使用GETPOST刪除。將您的api呼叫與相應的呼叫同步是一種很好的做法,但需要更多的努力進行設置。