在代码中,您在try代码块之前定义了client变量,并在finally代码块中关闭了数据库连接。但是,由于您使用了setInterval函数来定时执行代码,在执行完一次请求后,可能在client关闭之前又开始了下一次请求。这样,在下一次请求时,client可能还没有完成连接,就会导致报错"MongoNotConnectedError: Client must be connected before running operations"。

为了解决这个问题,您可以将client的定义和关闭放在try代码块中,这样可以确保在每次请求前都能正确连接数据库,并在请求完成后再关闭连接。修改后的代码如下:

const { MongoClient } = require('mongodb');
async function aa() {
  const { default: fetch } = await import('node-fetch');
  setInterval(async () => {
    try {
      // 连接 MongoDB 数据库
      const client = await MongoClient.connect('mongodb://127.0.0.1:27017');
      const db = client.db('waitingToJoinGroup');

      // 换取 AccessToken
      const tokenResponse = await fetch(`https://lowcode-0gtbzdgf5319e5ba.ap-shanghai.tcb-api.tencentcloudapi.com/auth/v1/token/clientCredential`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "Authorization": `Basic ${Buffer.from(`AKIDFLDrIVdZGj3B5ax76tW1JOM8jCNPFtKh:KRL9lBf3HIBuWwBD7tVwAKOHvJTQFqDM`).toString('base64')}`
        },
        body: JSON.stringify({
          grant_type: 'client_credentials',
        })
      });

      const { access_token } = await tokenResponse.json();

      // 构造查询字符串
      const queryString = `$filter=code eq '待处理'&$orderby=createdAt asc`;

      const queryResponse = await fetch(`https://lowcode-0gtbzdgf5319e5ba.ap-shanghai.tcb-api.tencentcloudapi.com/weda/odata/v1/prod/xhsjq_zhcs_eu9byud?${queryString}`, {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          "Authorization": `Bearer ${access_token}`
        }
      });

      const responseData = await queryResponse.json();
      console.log(JSON.stringify(responseData));

      if (responseData.value && responseData.value.length > 0) {
        const arr = [];

        for (const item of responseData.value) {
          const upload = "未上传";
          const { _id, sessionId, createdAt, code, password } = item;
          const createdDate = formatDate(createdAt);

          // 检查_id是否存在于数据库中
          const existingData = await db.collection('sessionId').findOne({ _id });

          if (!existingData) {
            // 插入新数据
            await db.collection('sessionId').insertOne({ _id, code, sessionId, upload, createdAt, createdDate, password });
            arr.push({ _id, sessionId, createdDate });
          }
        }

        // console.log(arr);
      }
    } catch (error) {
      console.error(error);
    } finally {
      // 关闭数据库连接
      if (client !== null) {
        client.close();
      }
    }
  }, 1000); // 每10秒执行一次请求
}

// 格式化日期时间为 "yyyy年MM月dd日 HH:mm:ss" 的格式
function formatDate(timestamp) {
  const dateObj = new Date(timestamp);
  const year = dateObj.getFullYear();
  const month = (dateObj.getMonth() + 1).toString().padStart(2, '0');
  const day = dateObj.getDate().toString().padStart(2, '0');
  const hours = dateObj.getHours().toString().padStart(2, '0');
  const minutes = dateObj.getMinutes().toString().padStart(2, '0');
  const seconds = dateObj.getSeconds().toString().padStart(2, '0');

  return `${year}年${month}月${day}日 ${hours}:${minutes}:${seconds}`;
}

aa();

这样修改后,每次请求都会先连接数据库,然后执行请求,最后关闭连接,避免了MongoNotConnectedError的报错

const MongoClient = requiremongodb;async function aa let client; 将 client 变量提前定义在 try 代码块之前 const default fetch = await importnode-fetch; setIntervalasync = try 连接 MongoDB 数据库

原文地址: https://www.cveoy.top/t/topic/iGAt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录