簡體   English   中英

Express 不能 PUT/DELETE 方法。 出了什么問題?

[英]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 PUTCannot 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 並假設userlocals的成員,那就是:

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")然后試試這個:

  1. 從 npm 安裝 method-override。
  2. 在你的 app.js 文件中需要它。
  3. 打開您想要調用 PUT 請求的表單
  4. 確保您的表單具有以下屬性:

    action="/movies/<%= movies._id %>?_method=PUT" method="POST" >

這兩個解決方案對我有用。 如果您正在關注 REST,那么使用方法-ovveride else app.post() 也可以解決問題

res.redirect('path')改為res.redirect(303, 'path')

PutDelete ,如果要重定向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM