1

I'm trying to return a object with hardware sensor value every time someone hits a specific route. However, after node start/reload first requested object gets stored in memory.

As described here I tried deleting cache for that specific module. However seems to be doing really nothing in my case.

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

This is how it's called later, in the routes

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

So every load/reload I get correct and expected results such as these ones:

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

However, I noticed later, they never change after no matter what. Perhaps I'm missing something here, couldn't find anything specific in debugger apart from that it already showed me in one of the steps that each require gets cached.

falken
  • 31
  • 5
  • try setting a no-cache header in your response as described here: https://stackoverflow.com/questions/20429592/no-cache-in-a-nodejs-server – Arthur Cinader Oct 25 '19 at 22:40
  • Thanks, but this is related to the browser cache and has nothing to do with node module cache – falken Oct 26 '19 at 04:52

1 Answers1

1

In controllers/readingsController.js when you require('./mqController') mqReadings is assigned the Promise returned by getGas().

If you need getGas() to be called again, you'll need to export a function that calls it:

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

and then update getAllReadings() to await mqReadings();

Dick Porter
  • 151
  • 2
  • 5