const MongoClient = requiremongodb;async function aa let client; 将 client 变量提前定义在 try 代码块之前 const default fetch = await importnode-fetch; setIntervalasync = try 连接 MongoDB 数据库
在代码中,您在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的报错
原文地址: https://www.cveoy.top/t/topic/iGAt 著作权归作者所有。请勿转载和采集!