{"record":{"id":"8c9c6ee9faf3333f","repo":"denoland/deno","slug":"err-invalid-arg-value-8c9c6e","errorCode":"ERR_INVALID_ARG_VALUE","errorMessage":"The argument 'address' is invalid. Received ${address}","messagePattern":"The argument 'address' is invalid\\. Received (.+?)","errorType":"error_code","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/internal/dns/promises.ts","lineNumber":302,"sourceCode":"    req.oncomplete = onlookupservice;\n    req.resolve = resolve;\n    req.reject = reject;\n\n    const errCode = cares.getnameinfo(req, address, port);\n\n    if (errCode) {\n      reject(dnsException(errCode, \"getnameinfo\", address));\n    }\n  });\n}\n\nfunction lookupService(address: string, port: number) {\n  if (arguments.length !== 2) {\n    throw new ERR_MISSING_ARGS(\"address\", \"port\");\n  }\n\n  if (isIP(address) === 0) {\n    throw new ERR_INVALID_ARG_VALUE(\"address\", address);\n  }\n\n  port = validatePort(port);\n\n  return createLookupServicePromise(address, port);\n}\n\nfunction createResolverPromise(\n  resolver: Resolver,\n  bindingName: string,\n  hostname: string,\n  ttl: boolean,\n) {\n  return new Promise((resolve, reject) => {\n    const req = new QueryReqWrap();\n\n    req.bindingName = bindingName;\n    req.hostname = hostname;","sourceCodeStart":284,"sourceCodeEnd":320,"githubUrl":"https://github.com/denoland/deno/blob/a961cdec3b1948844414ebeecc697dcad76df2d1/ext/node/polyfills/internal/dns/promises.ts#L284-L320","documentation":"lookupService() requires address to be a literal IPv4 or IPv6 string: it is validated with isIP(), and isIP(address) === 0 throws ERR_INVALID_ARG_VALUE. The API only does reverse (getnameinfo) resolution - forward-resolving a hostname like 'localhost' is not supported here.","triggerScenarios":"lookupService('localhost', 80); lookupService('example.com', 443); an empty string; or a URL/origin string like 'https://1.2.3.4:80' passed as the address.","commonSituations":"Passing peer hostnames that upstream code already resolved; feeding URL origins or host:port strings into an API that wants a bare IP; IPv6 values still wrapped in brackets.","solutions":["Resolve names first: const { address } = await dnsPromises.lookup(hostname), then lookupService(address, port).","Pre-check with net.isIP(address) !== 0 and reject early.","Normalize socket-style IPv6 (strip brackets) before calling."],"exampleFix":"// before\nawait dnsPromises.lookupService('localhost', 80);\n\n// after\nconst { address } = await dnsPromises.lookup('localhost');\nawait dnsPromises.lookupService(address, 80);","handlingStrategy":"validation","validationCode":"import { isIP } from 'node:net';\n\nasync function toIpLiteral(address) {\n  if (isIP(address) !== 0) return address;\n  const { address: resolved } = await dns.promises.lookup(address);\n  return resolved;\n}\nconst { hostname, service } = await dnsPromises.lookupService(await toIpLiteral(addr), port);","typeGuard":"import { isIP } from 'node:net';\nconst isIpLiteral = (s) => typeof s === 'string' && isIP(s) !== 0;","tryCatchPattern":"try {\n  await dnsPromises.lookupService(address, port);\n} catch (err) {\n  if (err?.code === 'ERR_INVALID_ARG_VALUE' && err.message.includes('address')) {\n    const r = await dnsPromises.lookup(address);\n    return dnsPromises.lookupService(r.address, port);\n  }\n  throw err;\n}","preventionTips":["lookupService does no forward DNS - resolve names with dns.lookup() first.","Filter peer addresses with net.isIP before reverse lookup.","Normalize IPv6 from socket APIs (strip brackets) before passing."],"tags":["dns","lookupservice","ip-address","argument-validation"],"backgroundTag":"dns-lookup-service","analyzedSha":"a961cdec3b1948844414ebeecc697dcad76df2d1","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}