jsrosetta

I/O

Tra cứu DNS

node:dns/promises của Node.js so với package net (Go), hickory-resolver (Rust), getaddrinfo (Swift, chỉ A/AAAA) và JNDI (Java) để tra cứu DNS.

Phiên bản tối thiểu
Node.js ≥ 15Go ≥ 1.9Rust ≥ 1.88Swift ≥ 3.0Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Tra cứu DNS (NS, A/AAAA, MX, TXT) có sẵn trong standard library của Node.js và Go, không cần thư viện ngoài. Rust std chỉ tra được A/AAAA qua ToSocketAddrs (dùng resolver của hệ điều hành) — muốn NS/MX/TXT phải dùng crate hickory-resolver, một resolver DNS thuần Rust chạy trong tiến trình, không qua libc. Swift/Foundation còn hạn chế hơn: chỉ có A/AAAA (qua getaddrinfo, vì Host đã bị to-be-deprecated và chỉ chạy trên macOS), không có API nào cho NS/MX/TXT cả. Java có InetAddress cho A/AAAA và JNDI (com.sun.jndi.dns.DnsContextFactory) cho mọi loại record khác — kỹ thuật cũ nhưng vẫn hoạt động tốt trên JDK hiện đại.

Tra cứu NS, IP, MX, TXT

import dns from 'node:dns/promises'
 
const ns = await dns.resolveNs('google.com')
console.log(ns)
 
const ips = await dns.resolve4('google.com')
console.log(ips)
 
const mx = await dns.resolveMx('google.com')
console.log(mx)
 
const txt = await dns.resolveTxt('google.com')
console.log(txt)
# kết quả DNS thay đổi theo thời điểm tra cứu, TXT được rút gọn bằng …
# (Node.js, Go, Rust, Java tra được cả NS/A/MX/TXT; Swift ở trên chỉ tra được A/AAAA)
ns1.google.com.
[142.251.12.138 142.251.12.102 …]
smtp.google.com. 10
[v=spf1 include:_spf.google.com ~all …]

Đổi DNS resolver server

dns.setServers(['1.1.1.1'])
console.log(dns.getServers())
 
const ns2 = await dns.resolveNs('google.com')
console.log(ns2)

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#dns