我的后端有套接字连接(exts.js),每秒都有来自该套接字的数据,我想将这些值存储到我的数据库(PostgreSQL).由于数据每秒都会到来,所以我不想在它们到来时存储它们,因为这将是大量的写入操作.所以我将它们保持在tempValues,并每隔1分钟将这些值存储到数据库中.但我觉得必须有更好的方法来完成这项工作,而不是使用setInterval.也许是第三方图书馆或其他什么?如果服务器崩溃或发生了什么事情,我可以释放临时数据.

以下是我当前的代码块:

let tempValues = [];

setInterval(() => {
  tempValues.map(async (option, i) => {
    await pool.query(
      "INSERT INTO plc_options (name, value, date) VALUES ($1, $2, $3)",
      [option.name, option.value, option.timestamp]
    );
    if (i === tempValues.length - 1) tempValues = [];
  })

}, 60000);


socket.onAny((eventName, ...args) => {
  tempValues.push({ name: eventName, value: args[0], timestamp: new Date() })
});

推荐答案

你不需要第三方图书馆.你的 idea 大体上还可以.这就是所谓的缓冲.不过,我会稍微改进一下.

let _tempValues = [];

function getTempValues() {
    return _tempValues;
}

function getAndClearTempValues() {
    let oldTempValues = _tempValues;
    _tempValues = [];
    return oldTempValues;
}

setInterval(() => {
  let values = getAndClearTempValues();
  values.map(async (option, i) => {
    await pool.query(
      "INSERT INTO plc_options (name, value, date) VALUES ($1, $2, $3)",
      [option.name, option.value, option.timestamp]
    );
  })

}, 60000);


socket.onAny((eventName, ...args) => {
  let values = getTempValues();   
  values.push({ name: eventName, value: args[0], timestamp: new Date() })
});

主要的变化是,我用循环遍历数组的空数组before替换了旧的tempValues.这样,当您在数组中进行异步循环,而其他代码对其进行修改时,我们就避免了潜在的Pitfal.另外,您不需要在setInterval中使用if语句.

Node.js相关问答推荐

Twilio-获取呼叫录音不起作用的请求

我的 MERN 网站一直告诉我我的一个函数不是一个函数

更新 mongodb 中的交易值

如何使用包含条件正确分页的 sequelize 查询?

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

npm chokidar 触发事件两次

fs.writefile 选项参数的可能值,尤其是只读文件的整数

使用 mongoose 查找过go 7 天的注册用户总数

file.slim.js 中的苗条是什么

如何使用 Mocha 测试正常(非 node 特定)JavaScript 函数?

什么使用/尊重 .node-version 文件?

Webpack TypeScript module.hot 不存在

Nodejs 随机免费 tcp 端口

如何监控 node.js 上的网络,类似于 chrome/firefox 开发者工具?

将变量传递给nodemailer中的html模板

为什么 Node 控制台不显示功能代码?

Node.js -Firebase 服务帐户私钥不会解析

如何在离线时安装 npm 包?

当进程被杀死时,如何优雅地关闭我的 Express 服务器?

Puppeteer 等待所有图像加载然后截图