Why does the Node crypto library do Diffie Hellman this way?
My understanding of Diffie Hellman is that both parties only ever need to generate a single random number, not a public/private key. 


That is not correct.

Wikipedia’s entry covers it pretty well. Once two parties have agreed upon a domain (the (g, p) pair) each member generates their own private key. Their shared secret is equal to

(g ^ (a * b)) % p


where a is Alice’s private key and b is Bob’s. Of course, each side can do this calculation without the other party revealing their private key.