我收到這個錯誤MongoExpiredSessionError: Cannot use a session that has ended。
我已經嘗試過類似問題中提出的答案,他們主要建議使用await關鍵字。但正如您將在下面的代碼中看到的那樣,我已經為我的所有資料庫函式設定了該關鍵字。
我正在使用代理連接服務器和客戶端(React)。有時它作業正常,但是當我在客戶端更新一些代碼時,由于某種原因服務器會拋出這個錯誤。然后,當我在服務器檔案中編輯某些內容時,它又開始正常作業(直到我在客戶端中編輯某些內容)。我猜問題在于我正在使用代理。
我按照本教程介紹了如何使用節點 js 服務器設定反應應用程式。讓我知道是否有更好的選擇。
這是我的代碼:
app.post("/getSubscribers", (req, res) => {
var ssn = req.session;
req.on("close", function(err1){
console.log("Connection closed (getSubscribers)");
console.log(err1);
})
if(!ssn.logged_in){
res.send(JSON.stringify("loggedout"));
}else{
(async () => {
try{
await client.connect();
console.log("1 (getSubscribers)");
const db = await client.db("data");
console.log("2 (getSubscribers)");
const collection = await db.collection("subscribers");
console.log("3 (getSubscribers)");
const query = {user_id: ssn.user_id};
console.log("4 (getSubscribers)");
const cursor = await collection.find(query);
console.log("5 (getSubscribers)");
const result = await cursor.toArray();
console.log("6 (getSubscribers)");
const count = await cursor.count();
console.log("7 (getSubscribers)");
const data = {data: result, count: count}
console.log("8 (getSubscribers)");
res.send(JSON.stringify(data));
console.log("9 (getSubscribers)");
}catch(err){
console.log("ERROR (getSubscribers)");
console.log(err);
}finally{
console.log("Closing (getSubscribers)")
await client.close();
}
})();
}
});
這是錯誤訊息:
[0] 1 (getSubscribers)
[0] 2 (getSubscribers)
[0] 3 (getSubscribers)
[0] 4 (getSubscribers)
[0] 5 (getSubscribers)
[0] ERROR (getSubscribers)
[0] MongoExpiredSessionError: Cannot use a session that has ended
[0] Closing (getSubscribers)
有時它停在#5,有時停在#6。
正如我所提到的,問題可能與服務器的設定方式有關,請查看鏈接并告訴我這是否是設定服務器的好方法,或者我是否應該采取不同的方式。
uj5u.com熱心網友回復:
您在每次向/getSubscribers. 因此,結束會話的一個原因可能是,如果您的服務器上收到多個請求,則在處理另一個請求時,第一個請求的底層連接將關閉。
無論如何,在每個請求上連接到您的資料庫并沒有多大意義,相反,您應該在啟動 express-app 時這樣做。我會使用與官方教程中類似的東西:
// file ./db/conn.js
const { MongoClient } = require('mongodb');
const client = new MongoClient(<tbd>, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
let dbConnection;
module.exports = {
connectToServer: (callback) => {
client.connect(function (err, db) {
if (err || !db) {
return callback(err);
}
dbConnection = db.db('<tbd>');
console.log('Successfully connected to MongoDB.');
return callback();
});
},
getDb: () => {
return dbConnection;
},
};
然后,您可以在主 app.js 檔案中像這樣使用它:
const app = express();
// ...
// get MongoDB driver connection
const dbo = require('./db/conn');
// perform a database connection when the server starts
dbo.connectToServer((err) => {
if (err) {
console.error(err);
process.exit();
}
// start the Express server
app.listen(PORT, () => {
console.log(`Server is running on port: ${PORT}`);
});
});
app.post("/getSubscribers", async (req, res) => {
const ssn = req.session;
if(!ssn.logged_in){
return res.send(JSON.stringify("loggedout"));
}
const collection = await dbo.getDb().collection("subscribers");
// rest of your code above
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/419528.html
標籤:
