【问题标题】:MongoDB + Express cannot use a session that has endedMongoDB + Express 无法使用已结束的会话
【发布时间】:2022-01-23 16:35:53
【问题描述】:

我收到此错误MongoExpiredSessionError: Cannot use a session that has ended

我已经尝试过类似问题中提出的答案,他们主要建议使用await 关键字。但正如您将在下面的代码中看到的那样,我已经为我的所有数据库函数设置了该关键字。

我正在使用代理来连接服务器和客户端(React)。 有时它可以正常工作,但是当我更新客户端中的某些代码时,由于某种原因,服务器会抛出此错误。然后,当我在服务器文件中编辑某些内容时,它又开始正常工作(直到我在客户端中编辑某些内容)。我猜问题在于我使用的是代理。

我关注了this tutorial,了解如何使用节点 js 服务器设置 React 应用程序。如果有更好的选择,请告诉我。

这是我的代码:

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。

正如我所提到的,问题可能与服务器的设置方式有关,请查看链接并告诉我这是设置服务器的好方法还是我应该采取不同的方式。

【问题讨论】:

    标签: node.js reactjs mongodb express proxy


    【解决方案1】:

    每次向/getSubscribers 发出请求时,您都会连接/断开与您的数据库的连接。因此,会话结束的一个原因可能是,如果您的服务器上收到多个请求,则在为第一个请求提供服务时,底层连接会关闭。

    无论如何,在每次请求时都连接到您的数据库并没有多大意义,相反,您应该在启动 express-app 时这样做。我会使用与official tutorial 中类似的东西:

    // 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
    });
    

    【讨论】:

    • 这个解决方案和官方教程也没有意义。因为没有指示何时或如何关闭连接。如果您在启动应用程序时打开连接,那么我们应该什么时候关闭它?如果您在请求后关闭它,您将无法连接后续请求。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2020-05-06
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多