Node.js新手求助:/mockServiceWorker.js文件找不到及URL异常问题
解决Node.js服务器中/mockServiceWorker.js文件找不到的问题
先搞懂/mockServiceWorker.js是什么
它是**Mock Service Worker(MSW)**的核心脚本,MSW是用来在浏览器端拦截网络请求做模拟的工具。一旦你的前端代码里注册了MSW,浏览器就会自动向服务器请求这个文件,这就是为什么过一会儿会出现这个请求的原因。
你的代码里的两个关键问题
条件判断用了赋值运算符
=而非比较运算符===
你写的if (req.url = "/mockServiceWorker.js")是把字符串赋值给req.url,而不是判断是否相等,这会导致所有请求都会被强制改成/mockServiceWorker.js,直接触发文件找不到的错误。未正确处理/mockServiceWorker.js的请求
不管你是不是有意使用MSW,这个请求都会被浏览器发起,你需要明确处理它,避免去读取不存在的文件。
修正后的代码方案
方案1:如果你没在用MSW,直接拦截这个请求返回404
import fs from 'fs'; import http from 'http'; import path from 'path'; // 引入path模块处理文件路径,避免绝对路径问题 http.createServer(async (req, res) => { // 拦截mockServiceWorker的请求,直接返回404 if (req.url === "/mockServiceWorker.js") { res.writeHead(404, { "Content-Type": "text/plain" }); res.write("File not found"); res.end(); return; } let filePath = req.url; if (filePath === "/") { filePath = "file2.html"; } // 用path.resolve转为绝对路径,避免读取根目录的文件 const resolvedPath = path.resolve(filePath); try { let text = await fs.promises.readFile(resolvedPath, "utf8"); res.writeHead(200, { "Content-Type": "text/html" }); res.write(text); res.end(); } catch (err) { // 处理其他文件找不到的情况,返回404 res.writeHead(404, { "Content-Type": "text/plain" }); res.write(`File not found: ${filePath}`); res.end(); } }).listen(3000);
方案2:如果你确实在用MSW,返回正确的脚本文件
如果你是有意使用MSW,需要确保mockServiceWorker.js文件在你的项目目录里,然后修改代码返回这个文件:
import fs from 'fs'; import http from 'http'; import path from 'path'; http.createServer(async (req, res) => { let filePath = req.url; if (filePath === "/") { filePath = "file2.html"; } else if (filePath === "/mockServiceWorker.js") { // 指向MSW的脚本文件路径,根据你的实际位置调整 filePath = path.resolve('./node_modules/mock-service-worker/browser/mockServiceWorker.js'); res.writeHead(200, { "Content-Type": "application/javascript" }); } const resolvedPath = path.resolve(filePath); try { let text = await fs.promises.readFile(resolvedPath, "utf8"); res.write(text); res.end(); } catch (err) { res.writeHead(404, { "Content-Type": "text/plain" }); res.write(`File not found: ${filePath}`); res.end(); } }).listen(3000);
额外建议
- 永远用
===做严格相等判断,避免==的隐式类型转换问题,更不要把=当成判断用。 - 处理文件读取时一定要加try/catch,避免服务器因为单个文件错误直接崩溃。
- 如果不需要MSW,检查你的前端代码里有没有注册MSW的代码(比如
worker.start()之类的),删掉就能彻底消除这个请求。
内容的提问来源于stack exchange,提问作者Nick Poznyakov
相关产品推荐
相关产品推荐

