node.js - 我的函数结果被节点缓存,只有重新加载/重启有帮助
问题描述
每次有人到达特定路线时,我都会尝试返回具有硬件传感器值的对象。但是,在节点启动/重新加载后,第一个请求的对象被存储在内存中。
如此处所述,我尝试删除该特定模块的缓存。但是,在我的情况下似乎什么也没做。
// /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
}
但是,我后来注意到,无论如何它们都不会改变。也许我在这里遗漏了一些东西,在调试器中找不到任何特定的东西,除了它已经在每个需要被缓存的步骤之一中向我展示了。
解决方案
当controllers/readingsController.js
您require('./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();
推荐阅读
- swift - NavigationLink 绑定问题
- ios - 如何为 iPhone 8 屏幕与 iPhone X 及更高版本的底部锚点设置不同的常量?
- java - 以编程方式添加 imageview 约束问题
- python - 如何将(纬度,经度)坐标转换为 tkinter 画布的坐标
- python-3.x - 如何使用 kivy 访问 iPhone 的位置?
- python - 我究竟做错了什么?“TypeError:不能将序列乘以‘str’类型的非整数”
- video - YOLO 用于视频(图像序列)
- php - PHP XPath 获取属性值的一部分
- json - 如何在 Python 中获取 JSON 值的索引?
- python - 如何修复 - '文件不包含节标题错误?