Closed Telokis closed 1 year ago
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 true
Symbol
instead of null
to represent a cache miss.Symbol
.enableNullValues
is false
or undefined
null
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!
I've added a missingResponse
cacher option. The cachers return the value of it if the key is not found. By default, the value is undefined
, so it enables to store null
values, as well. If you would like to store undefined
values, then you can change it to a symbol, e.g.: missingResponse: Symbol("MISSING")
.
Prerequisites
Please answer the following questions for yourself before submitting an issue.
Current Behavior
null
andundefined
cannot be cached by moleculer.Expected Behavior
I expected at least
null
to be a cacheable value.Failure Information
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 thannull
until I ask the cache to be cleaned.Steps to Reproduce
null
.Reproduce code snippet
Possible solution
Instead of using a weak comparison against
null
in the cacher base (cachers/base.js#L303) we can strongly compare againstundefined
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).