Please answer the following questions for yourself before submitting an issue.
null and undefined cannot be cached by moleculer.
I expected at least null to be a cacheable value.
More often than not, a specific action will be invalid. For example, trying to get a specific id from database but it doesn't exist.
In such a case, it makes sense to return null but I don't want to be flooded by requests since I know it won't return anything other than null until I ask the cache to be cleaned.
null.const broker = new ServiceBroker({
logger: console,
transporter: "NATS",
cacher: "Memory"
});
broker.createService({
name: "test",
actions: {
example: {
cache: true, // Enable caching
async handler(ctx) {
// Artificial pause for demonstration purposes
await new Promise((resolve) => setTimeout(resolve, 1000));
return null; // Return null
}
}
}
});
Instead of using a weak comparison against null in the cacher base (cachers/base.js#L303) we can strongly compare against undefined using !== undefined.
But I think the best solution would be to use a Symbol which is specific to moleculer. This way, we know nobody will be tempted to return it from inside their action.
However, I understand that this would be a breaking change (and I'm a bit saddened by this fact).
Could you create a PR? I think we can avoid the breaking change if we switch the old/new logic with a cacher option, e.g. storeNullValues: true
By the way, as I see, the value is stored, just not return it, right?
By the way, as I see, the value is stored, just not return it, right?
Yes, from what I noticed, the value is properly stored and retrieved but the code I highlighted makes it seem like a cache miss and calls the action anyway.
Regarding the PR, I could do it if we come up with a good non-breaking solution, yes.
I thought it could be regarded as a breaking change for people who use custom cachers but I guess the configuration option fixes this issue.
Yeah, but in this case, the option name enableNullValues would be better because the storing is good. And as you mentioned, we should return a Symbol in get if it's not found in the cache and also check this symbol in the base middleware.
Thanks for your answer. To make sure I understand:
enableNullValues to cachers/base.js#L29enableNullValues is set to trueSymbol instead of null to represent a cache miss.Symbol.enableNullValues is false or undefinednull as we do now.null to detect cache misses.Is this correct?
Yeah, you are correct. Could you make a PR? Of course, need to add relevant tests, as well.
@Telokis any news?
@intech Hi! No, I didn't work on/with Moleculer since around then. I still need to properly finish my PR #829 and won't consider tackling this issue until that PR is done.
@intech Hi! No, I didn't work on/with Moleculer since around then. I still need to properly finish my PR #829 and won't consider tackling this issue until that PR is done.
@Telokis thanks for the answer. I have now submitted for consideration changes to the serialization algorithm in order to solve 3 urgent problems at once, including yours.
Therefore, I wanted to warn you, before you start work, let me know in the comments about it. Perhaps we will already have another solution ready.
@intech Hi! No, I didn't work on/with Moleculer since around then. I still need to properly finish my PR #829 and won't consider tackling this issue until that PR is done.
@Telokis thanks for the answer. I have now submitted for consideration changes to the serialization algorithm in order to solve 3 urgent problems at once, including yours.
Therefore, I wanted to warn you, before you start work, let me know in the comments about it. Perhaps we will already have another solution ready.
@intech Ok, seems like a good idea, thank you for letting me know about it!