[{"data":1,"prerenderedAt":111},["ShallowReactive",2],{"blog-en-archive":3},[4,13,21,26,33,39,45,50,56,62,67,72,78,85,90,98,104],{"path":5,"title":6,"meta":7},"\u002Fen\u002Fweb-security-sql-injection-xss-csrf","The 3 Basic Web Attacks: How SQL Injection, XSS, and CSRF Work and How to Stop Them",{"date":8,"field":9,"tags":10},"2026.10.09","backend",[11,12],"web-security","nodejs",{"path":14,"title":15,"meta":16},"\u002Fen\u002Fapi-error-response-format","Designing API Error Responses: Unifying Inconsistent Errors with RFC 9457 Problem Details",{"date":17,"field":9,"tags":18},"2026.10.08",[19,20],"api","http",{"path":22,"title":23,"meta":24},"\u002Fen\u002Fcors-guide","CORS Errors Explained: Why Requests Get Blocked and How to Fix Preflight and Credentials Correctly",{"date":17,"field":9,"tags":25},[20,11,12],{"path":27,"title":28,"meta":29},"\u002Fen\u002Fcss-has-selector","A Practical Guide to the CSS :has() Selector: Selecting Parents Without JavaScript",{"date":17,"field":30,"tags":31},"frontend",[32],"css",{"path":34,"title":35,"meta":36},"\u002Fen\u002Fhtml-features-without-javascript","Things HTML Can Do Without JavaScript: Stop Building Everything Out of divs",{"date":17,"field":30,"tags":37},[38],"html",{"path":40,"title":41,"meta":42},"\u002Fen\u002Fhttp-cache-control-guide","Using HTTP Caching Correctly: Cache-Control, ETag, and no-cache vs no-store",{"date":17,"field":9,"tags":43},[20,44],"vercel",{"path":46,"title":47,"meta":48},"\u002Fen\u002Fhttp-status-codes-guide","Using HTTP Status Codes Correctly: 400 vs 422, 401 vs 403, and 200 vs 201 vs 204",{"date":17,"field":9,"tags":49},[20,19],{"path":51,"title":52,"meta":53},"\u002Fen\u002Fjavascript-async-error-handling","Handling Async Errors in JavaScript Correctly: From What try\u002Fcatch Misses to Promise.all vs allSettled",{"date":17,"field":30,"tags":54},[55],"javascript",{"path":57,"title":58,"meta":59},"\u002Fen\u002Fjavascript-event-loop","The JavaScript Event Loop Explained: How Microtasks and Macrotasks Are Ordered",{"date":17,"field":60,"tags":61},"concepts",[55,12],{"path":63,"title":64,"meta":65},"\u002Fen\u002Fjavascript-higher-order-functions","JavaScript Higher-Order Functions Explained: From map, filter, and reduce to Building once and memoize",{"date":17,"field":30,"tags":66},[55],{"path":68,"title":69,"meta":70},"\u002Fen\u002Fjavascript-nullish-coalescing-optional-chaining","JavaScript ?? vs ||: How to Handle null, undefined, 0, and Empty Strings Correctly",{"date":17,"field":30,"tags":71},[55],{"path":73,"title":74,"meta":75},"\u002Fen\u002Fjwt-vs-session-auth","JWT vs Session Authentication: Which Should You Use? Storage, Logout, and Security Compared",{"date":17,"field":9,"tags":76},[77,11],"auth",{"path":79,"title":80,"meta":81},"\u002Fen\u002Fnodejs-graceful-shutdown","Graceful Shutdown in Node.js: Why Requests Drop Every Time You Deploy",{"date":17,"field":9,"tags":82},[12,83,84],"docker","pm2",{"path":86,"title":87,"meta":88},"\u002Fen\u002Fsemantic-html-common-mistakes","Writing Meaningful HTML: 7 Semantic HTML Mistakes Almost Everyone Makes",{"date":17,"field":30,"tags":89},[38],{"path":91,"title":92,"meta":93},"\u002Fen\u002Fnuxt-content-vercel-empty-query-sqlite","Nuxt Content v3 queryCollection() Returns Empty on Vercel (But Works Locally)",{"date":94,"field":95,"tags":96},"2026.10.07","blog",[97,44],"nuxt-content",{"path":99,"title":100,"meta":101},"\u002Fen\u002Fnuxt-useasyncdata-cache-error","Nuxt 3 useAsyncData Caching Bug: Why Every Post Shows the Same Content",{"date":94,"field":30,"tags":102},[103],"nuxt",{"path":105,"title":106,"meta":107},"\u002Fen\u002Fvue-query-ref-value-trap-nuxt3","Why Your Vue Query Data Doesn't Show Up in Nuxt 3 (the ref unwrapping trap)",{"date":94,"field":30,"tags":108},[103,109,110],"vue","tanstack-query",1791864388635]