I guess you're binding explicitly to the external IP? You can try omitting the host parameter, which effectively binds to all interfaces, both internal IP and external IP:
NodeJs: server.listen(port[, hostname][, backlog][, callback])
If you run ifconfig on the VM, you will find the external IP is not there. I believe the external IP is a virtual IP in Compute Engine, the underlying networking infrastructure automatically translates it to the internal IP.
$ ifconfig
eth0 Link encap:Ethernet HWaddr 42:01:0a:80:00:02
inet addr:10.128.0.2 Bcast:10.128.0.2 Mask:255.255.255.255
inet6 addr: fe80::4001:aff:fe80:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:1979 errors:0 dropped:0 overruns:0 frame:0
TX packets:1363 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:252712 (252.7 KB) TX bytes:182530 (182.5 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
python -m SimpleHTTPServer <port>in the VM and try accessing it from the internet. It always works for me once I get the firewall set. - Dagang