[英]Express cannot PUT/DELETE method. What is going wrong?
好的所以我在這里設置了一個簡單的 node.js / express.js / mongodb 應用程序,我的配置如下。
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="/users/#{user.name}">
<input type="hidden" name="_method" value="PUT"/>
</form>
現在我的路由器使用 express .put() 方法捕獲路由
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 對方法刪除和放置的支持而不使用 methodoverride 的問題
大多數 Web 瀏覽器都提供 PUT、DELETE、HEAD 等方法嗎?
與其他一些人一起。 我還多次引用了 express.js 和 mongo 文檔。 我只是想不出哪里出了問題。
任何幫助表示贊賞。
更新
正如喬納森·洛諾夫斯基(Jonathan Lonowski)指出的那樣,也可以使用PUT
,因此您可以忽略我的舊答案。 出現Cannot PUT
或Cannot POST
錯誤,意味着您的回調沒有成功執行。 我的猜測是Users.update
失敗,這就是它不能 POST 或 PUT 的原因。 你能檢查一下嗎。
舊答案
嘗試更改此行
app.put('/users/:name', function(req, res) {
到
app.post('/users/:name', function(req, res) {
因為您正在嘗試提交表單
您在__dirname + "/public"
下的視圖或static
文件中列出了<form>
嗎?
在靜態文件中, #{user.name}
可能不會被user
name
替換,而是會被視為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
需要是動態的和數據驅動的。 使用 Jade 並假設user
是locals
的成員,那就是:
form(method='POST', action='/users/' + user.name)
input(type='hidden', name='_method', value='PUT')
除非有奇怪的魔法在起作用,否則您的表單會發出 POST 請求,而不是 PUT。 如果你想 PUT,我建議使用帶有type: 'PUT'
參數的jQuery.ajax
函數,就像這個答案一樣,來自表單處理程序,請參閱jQuery.submit
。 不要忘記return false
以便表單不會提交兩次。
如果您的 using 方法覆蓋,請確保在使用路由之前已聲明它。 這就是我遇到的問題。
app.post("/movies/:id")是一種解決方案。 如果你仍然想使用app.put("/movies/:id")然后試試這個:
確保您的表單具有以下屬性:
action="/movies/<%= movies._id %>?_method=PUT" method="POST" >
這兩個解決方案對我有用。 如果您正在關注 REST,那么使用方法-ovveride else app.post() 也可以解決問題
將res.redirect('path')
改為res.redirect(303, 'path')
在Put
和Delete
,如果要重定向get
地址,則應將 303 作為第一個參數傳遞。 (來源)
一種解決方案是在您的app.js文件中為您的PUT、PATCH 和 DELETE請求使用cors中間件,如下所示:
首先通過 npm 安裝cors包:
npm i cors
然后將以下代碼添加到您的 app.js 中:
const cors = require('cors')
app.use(cors())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.