我的快速申請中有以下路線:
router.get('/edit/:id', (req, res)=> {
let searchQuery = {_id : req.params.id};
console.log(searchQuery)
Address.findOne(searchQuery)
.then(address => {
res.render('myForm', {address:address});
})
.catch(err => {
console.log(err);
});
});
我的表格是:
<form action="/edit/<%= address.id %>?_method=put" method="POST">
<input type="hidden" name="_method" value="PUT">
<br>
<input type="text" value="<%= address.name %>" name="name" >
<br>
<input type="text" value="<%= address.email %>" name="email" >
<br>
<button type="submit" >Update User</button>
</form>
它作業正常,我可以看到從 mongodb 到 myForm 的資料。現在,在我更新此表單中的一些資料并單擊 udpdate 按鈕后,我得到:Cannot POST /edit/62185a7efd51425bbf43e21a
注意到我有以下路線:
router.put('/edit/:id', (req, res)=> {
let searchQuery = {_id : req.params.id};
console.log(`searchQuery = ${searchQuery}`)
Address.updateOne(searchQuery, {$set: {
name: _.extend(name, req.body),
email: req.body.email,
}})
.then(address => {
res.redirect('/');
})
.catch(err => {
res.redirect('/');
});
});
在我的情況下,它看起來像是 express 呼叫 get 而不是 put 。有什么建議嗎?
uj5u.com熱心網友回復:
瀏覽器本身只會從<form>. 因此,您的瀏覽器正在發送一個 POST,而您的服務器沒有該 POST 的處理程式。
您添加到您的 URL的?_method=put那個看起來您希望在服務器上使用某種方法轉換或覆寫工具,以便它能夠識別該表單 POST,就好像它是一個 PUT。您沒有顯示任何服務器端代碼來識別覆寫查詢引數,因此顯然您的服務器只是接收 POST 并且沒有處理程式,因此您收到錯誤訊息CANNOT POST /edit/62185a7efd51425bbf43e21a。
有幾種不同的中間件解決方案可以執行此覆寫。這是 Express 中的一個: http: //expressjs.com/en/resources/middleware/method-override.html,您可以在該檔案中查看如何部署/配置它。
基本上,您將使用以下命令安裝模塊:
npm install method-override
然后將其添加到您的服務器:
const methodOverride = require('method-override')
// override with POST having ?_method=PUT
app.use(methodOverride('_method'));
這將查看帶有?_method=PUT查詢字串的傳入 POST 請求,并將根據查詢字串中的引數修改方法,以便app.put()匹配它。
當客戶端只能執行 GET 或 POST 而不能執行其他有用的方法(例如 PUT 或 DELETE)時,將使用此選項。
作為演示,當我按下 HTML 表單中的“更新用戶”按鈕時,這個簡單的應用程式作業并輸出got it!回瀏覽器和服務器控制臺。/edit/123456789?_method=put
const app = require('express')();
const path = require('path');
const methodOverride = require('method-override');
app.use(methodOverride('_method'));
app.get("/", (req, res) => {
res.sendFile(path.join(__dirname, "temp.html"));
});
app.put('/edit/:id', (req, res) => {
console.log(req.url);
res.send("got it!");
});
app.listen(80);
而且,temp.html這是:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="/edit/123456789?_method=put" method="POST">
<br>
<input type="text" value="hello" name="name" >
<br>
<input type="text" value="[email protected]" name="email" >
<br>
<button type="submit" >Update User</button>
</form>
</body>
</html>
uj5u.com熱心網友回復:
您可以使用 app.route() 為路由路徑創建可鏈接的路由處理程式。因為路徑是在單個位置指定的,所以創建模塊化路由是有幫助的,因為這有助于減少冗余和拼寫錯誤。 注意:您必須將表單標簽中的方法更改為 PUT
<form action="/edit/<%= address.id %>" method="put">
//Backend.js
router.route('/edit/:id')
.get((req, res) => {
res.send('Get a random book')
})
.put((req, res) => {
res.send('Update the book')
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440590.html
