我的前端應用程式向我的 Express.js 應用程式發出請求。Express 應用程式使用官方 MongoDB Node.js 驅動程式向我的 (Atlas) MongoDB 發出請求。當前端app取消一個請求(如AbortController、CancelToken)時,如何讓Express端點殺死對應的MongoDB請求?
相關端點代碼:
export default async function search(req, res) {
try {
const payload = await collection.aggregate(pipeline).toArray()
return res.status(200).send(payload)
} catch ({ message, stack }) {
return res.status(400).send({ message, stack })
}
}
uj5u.com熱心網友回復:
這有兩個成分:
首先,您需要一個允許您中止資料庫請求的 API 方法。MongoDB Node.js 驅動程式包含一個方法cursor.close,在我看來,它就像你需要的一樣。但是您應該檢查檔案是否有更好的方法。
其次,您的中間件必須檢測請求或回應流何時被前端應用程式關閉。這必須與close成功發送所有內容后的事件區分開來(否則將在每個資料庫請求完成后嘗試“關閉游標”操作)。下面的代碼實作了這一點:
app.use(async function(req, res) {
let destroyed;
const cursor = await collection.aggregate(pipeline)
req.on("close", function() {
if (!this.complete) {
destroyed = true;
cursor.close();
}
});
res.on("close", function() {
if (!this.writableEnded) {
destroyed = true;
cursor.close();
}
});
const payload = await cursor.toArray();
if (!destroyed)
return res.status(200).send(payload);
});
您可能可以省略req.on(...), 因為請求正文太小,以至于在請求仍在發送時不太可能被取消。但是res.on(...)在等待回應完成的同時取消請求時將呼叫 。
該destroyed變數旨在確保如果請求已被取消,則不會嘗試發送回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/530895.html
