{"record":{"id":"ca2f9fb25cad8312","repo":"denoland/deno","slug":"err-invalid-arg-type-ca2f9f","errorCode":"ERR_INVALID_ARG_TYPE","errorMessage":"The \"headers\" argument must be an instance of Headers or Map. Received ${headers}","messagePattern":"The \"headers\" argument must be an instance of Headers or Map\\. Received (.+?)","errorType":"exception","errorClass":"NodeTypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/_http_outgoing.ts","lineNumber":1159,"sourceCode":"    },\n    writable: true,\n    enumerable: true,\n    configurable: true,\n  },\n  setHeaders: {\n    __proto__: null,\n    value: function setHeaders(headers: any) {\n      if (this._header) {\n        throw new ERR_HTTP_HEADERS_SENT(\"set\");\n      }\n\n      if (\n        !headers ||\n        ArrayIsArray(headers) ||\n        typeof headers.keys !== \"function\" ||\n        typeof headers.get !== \"function\"\n      ) {\n        throw new ERR_INVALID_ARG_TYPE(\n          \"headers\",\n          [\"Headers\", \"Map\"],\n          headers,\n        );\n      }\n\n      let cookies = null;\n      const iterator = headers[SymbolIterator]();\n      while (true) {\n        // deno-lint-ignore deno-internal/prefer-primordials\n        const { done, value: entry } = iterator.next();\n        if (done) {\n          break;\n        }\n        const key = entry[0];\n        const value = entry[1];\n        if (key === \"set-cookie\") {\n          if (ArrayIsArray(value)) {","sourceCodeStart":1141,"sourceCodeEnd":1177,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/ext/node/polyfills/_http_outgoing.ts#L1141-L1177","documentation":"setHeaders() duck-types its argument: it must be non-null, not an array, and expose callable `.keys()` and `.get()` - in practice a Headers or Map instance. Anything else (plain object, array of pairs, string) throws ERR_INVALID_ARG_TYPE.","triggerScenarios":"res.setHeaders({'x-a': '1'}) (plain object), res.setHeaders([['x-a','1']]) (array of entries), res.setHeaders('x-a=1') (string), or res.setHeaders(null).","commonSituations":"Developers assuming object-literal semantics from setHeader(); passing fetch-style Headers built wrong; passing a serialized headers array from another layer of the app.","solutions":["Wrap entry pairs: res.setHeaders(new Map([['x-a','1']]))","Or wrap an object: res.setHeaders(new Headers({'x-a':'1'}))","Type the parameter as `Headers | Map<string,string>` in your own wrappers so the mistake is caught at compile time"],"exampleFix":"// before\nres.setHeaders({ 'x-a': '1', 'x-b': '2' }); // throws ERR_INVALID_ARG_TYPE\n\n// after\nres.setHeaders(new Map([['x-a','1'], ['x-b','2']]));\n// or\nres.setHeaders(new Headers({ 'x-a': '1', 'x-b': '2' }));","handlingStrategy":"type-guard","validationCode":"const ok = h !== null &&\n  !Array.isArray(h) &&\n  typeof h === 'object' &&\n  typeof h.keys === 'function' &&\n  typeof h.get === 'function';\nif (ok) res.setHeaders(h);\nelse res.setHeaders(new Map(Object.entries(h ?? {})));","typeGuard":"function isHeadersLike(v: unknown): v is Headers | Map<string, string> {\n  return !!v && typeof v === 'object' && !Array.isArray(v) &&\n    typeof (v as any).keys === 'function' && typeof (v as any).get === 'function';\n}","tryCatchPattern":"try {\n  res.setHeaders(headers);\n} catch (e) {\n  if (e?.code === 'ERR_INVALID_ARG_TYPE' && /headers/.test(e.message)) {\n    res.setHeaders(new Map(Object.entries(headers)));\n  } else throw e;\n}","preventionTips":["Type your helpers as (headers: Headers | Map<string,string>) => void","Remember setHeaders takes Map/Headers, while setHeader takes name/value strings","Convert plain objects at the boundary: new Map(Object.entries(obj))"],"tags":["http","headers","types","node-compat"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}