我使用 Node、Express 和 Mongoose 創建了一個待辦事項串列應用程式:
要洗掉任務,用戶點擊右側的十字按鈕。這會將帶有任務 ID 的 POST 請求發送到/delete_task端點。此端點的路由器是/routes/delete_task.js:
var express = require('express');
const Task = require('../models/task');
var router = express.Router();
express.json();
router.post('/', async (req, res, next) => {
const deleted_task = await Task.findByIdAndDelete(req.body.taskID);
console.log('Deleted task: \n', deleted_task);
res.redirect('..');
}
);
module.exports = router;
路由器執行 a findByIdAndDelete,然后重定向到主目錄。主目錄的路由器呈現集合中所有現有任務的視圖,如下所示:
var express = require('express');
const Task = require('../models/task');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
Task.find({}, function (err, result) {
if (err) {console.error(err)};
if (result) {
return res.render('index', {title: 'To-do list', tasks: result})
};
});
});
module.exports = router;
我的問題是洗掉任務時,findByIdAndDelete成功洗掉了任務,但這并沒有反映在重定向的主頁中。僅在重繪 頁面后,已洗掉的任務才會消失。這表明這是某種異步問題,并且重定向是在findByIdAndDelete查詢完成執行之前發生的。
為了解決這個問題,我將router.post()回呼設為一個async函式并在await上使用findByIdAndDelete,我還嘗試將 放在res.redirect('..')的回呼函式中findByIdAndDelete,這也不能解決問題:
router.post('/', (req, res, next) => {
Task.findByIdAndDelete(req.body.taskID, (err, result) => {
if (err) {
console.error(err)
};
if (result) {
console.log(result)
};
res.redirect('..');
});
});
我在 stackoverflow 上尋找了其他問題,所有這些似乎都表明這是一個異步問題,由在查詢完成執行之前發生的重定向引起。我發現的建議解決方案是使router.post(...)回呼成為異步函式并等待 Mongoose 查詢的結果,或者將其res.redirect('..')放在回呼中,findByIdAndDelete以便在查詢完成執行后發生重定向。我已經嘗試了這兩種方法,但問題仍然存在。
我唯一能想到的另一件事是我試圖從 POST 請求中重定向,我不知道這是否合法。查看日志似乎作業正常(請參閱最后 2 行,其中 GET 請求/遵循 POST 請求/delete_task):
New task submitted: cake
New task created successfully: cake
POST /new_task 302 29.747 ms - 46
GET / 200 4.641 ms - 1701
GET /stylesheets/style.css 304 0.849 ms - -
GET /javascripts/delete_task.js 304 0.479 ms - -
Deleted task:
{
_id: new ObjectId("636a993ca0b8e1f2cc79232a"),
content: 'cake',
completed: false,
__v: 0
}
POST /delete_task 302 10.358 ms - 24
GET / 200 3.867 ms - 1348
這是我碰到磚墻的地方,我看不出可能導致問題的原因。非常感謝任何人可能有的任何幫助或建議 - 干杯。
uj5u.com熱心網友回復:
我不認為這是異步的問題,因為您在回應 POST 請求之前等待正確。
但是只有當點擊十字按鈕從待辦事項串列頁面導航res.redirect到頁面并從那里回傳時才有意義,這得益于重定向。這只有在點擊按鈕時提交的 HTML 元素才有可能。/delete_task<form>
你是這樣實作的嗎?您說您“發送 POST 請求”,但這是通過<form>,還是通過axios.post或類似的 Javascript 方法?在后一種情況下,會發生以下情況:
- Javascript 客戶端發送 POST 請求并在資料庫上執行洗掉。
- Javascript 客戶端接收重定向回應并發送 GET 請求。
- Javascript 客戶端接收待辦事項串列的 HTML 頁面作為回應,但不對其執行任何操作。
換句話說:此請求不會重新加載待辦事項串列頁面。axios.post如果您希望發生這種情況,請不要使用重定向回應 POST 請求,而只需使用 200 OK,并讓 Javascript 客戶端location.reload()在收到此回應時執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529997.html
標籤:节点.js表示异步猫鼬
上一篇:在另一個中間件中呼叫中間件
