The foundation for debugging and just getting software as a whole is understanding the end-to-end flow. This is a mental framework that can be applied to any language and any stack, even if you have never worked on it before.
For most of you, you're working with something like this:
Once you figure out what steps are necessary for the flow you're debugging, you can systematically go through them one-by-one until you identify which one is breaking.
Related resources: