I always do this. I add a hit()
function on all the bodies scripts that can take damage.
Then when the area enters a body, i ask in the bullet script:
func on_Area2D_body_entered(body):
if body.has_method("hit"):
body.hit()
queue_free() #or whatever you do to destroy the bullet
Then just connect the body_entered signal of the bullet to that function in the bullet script.
When the bullet hits an body, it will call the body's hit function if present.
To make it easier, you can make your enemies always inherit from a custom Enemy class, so you dont have to code the hit function for every new enemy.
I find this ways is nice, because the bullets makes damage to bodies, so is the bullet responsability to call the hit function of the body, to make damage to them. Not the body responsability to make damage to itself when hitting a bullet.
Also, you can have arguments to the hit fundtion, to specify other things. I usually have at least the damage value and the maker of the damage as parameters, but that's up to you.