首页 > 解决方案 > 我的函数结果被节点缓存,只有重新加载/重启有帮助

问题描述

每次有人到达特定路线时,我都会尝试返回具有硬件传感器值的对象。但是,在节点启动/重新加载后,第一个请求的对象被存储在内存中。

如此处所述我尝试删除该特定模块的缓存。但是,在我的情况下似乎什么也没做。

// /controllers/mqController.js

const getGas = () => {
  return new Promise((resolve, reject) => {
    const gas = msa.open(Number(process.env.SPI_CHANNEL), { speedHz: 20000 }, err => {
      if (err) reject(err);
      else
        resolve(
          new Promise((rslv, rjct) => {
            gas.read((error, readable) => {
              if (error) rjct(error);
              else rslv(readable);
            });
          }),
        );
    });
  });
};

exports.mqReadings = getGas()
  .then(res => {
    return {
      lpg: mQGetGasPercentage(res.value, measureData.gasLPG),
      co: mQGetGasPercentage(res.value, measureData.gasCO),
      smoke: mQGetGasPercentage(res.value, measureData.gasSMOKE),
      rawDbg: res.rawValue,
    };
  })
  .catch(err => console.error(err));
{
  "lpg": 2.28348626551635,
  "co": 2.292945532477404,
  "smoke": 2.291557122676283,
  "rawDbg": 153
}

这就是稍后在路由中调用的方式

// controllers/readingsController.js

const { mqReadings } = require('./mqController');
const AppError = require('../utils/appError');

exports.getAllReadings = async (req, res, next) => {
  try {
    const mq = await mqReadings;

    res.status(200).json({
      status: 'success',
      mq,
    });

    next();
  } catch (e) {
    return new AppError(e.message, '500');
  }
};

所以每次加载/重新加载我都会得到正确和预期的结果,例如:

{
  "lpg": 2.28348626551635,
  "co": 2.292945532477404,
  "smoke": 2.291557122676283,
  "rawDbg": 153
}

但是,我后来注意到,无论如何它们都不会改变。也许我在这里遗漏了一些东西,在调试器中找不到任何特定的东西,除了它已经在每个需要被缓存的步骤之一中向我展示了。

标签: node.js

解决方案


controllers/readingsController.jsrequire('./mqController') mqReadings被分配时,返回的 Promise 由getGas().

如果需要getGas()再次调用,则需要导出调用它的函数:

exports.mqReadings = () => getGas()
  .then(res => {
    return {
      lpg: mQGetGasPercentage(res.value, measureData.gasLPG),
      co: mQGetGasPercentage(res.value, measureData.gasCO),
      smoke: mQGetGasPercentage(res.value, measureData.gasSMOKE),
      rawDbg: res.rawValue,
    };
  })
  .catch(err => console.error(err));

然后更新getAllReadings()await mqReadings();


推荐阅读