Node.js报错TypeError [ERR_INVALID_ARG_TYPE]:path参数类型错误求助
解决Node.js静态文件服务器的
ERR_INVALID_ARG_TYPE错误 嘿,别着急,这个问题其实是两个很容易忽略的小细节导致的——你把两个需要调用的函数当成了直接使用的变量,没加括号!
问题1:process.cwd是函数,必须调用它
错误提示里的Received function wrappedCwd已经很明显了:你用了process.cwd,但它是一个方法,不是字符串属性。要获取当前工作目录的路径字符串,必须加上括号调用它:process.cwd()。
原来的代码行:
var fileName = path.join(process.cwd, unescape(uri));
修复后:
var fileName = path.join(process.cwd(), unescape(uri));
问题2:stats.isDirectory同样需要调用
第二个隐藏的问题是目录判断的部分:stats.isDirectory是一个方法,必须加括号调用才能判断当前路径是否是目录。如果不加括号,你其实是在判断“这个函数是否存在”,结果永远是true,会导致所有目录都强制跳转到index.html,逻辑完全错误。
原来的代码行:
} else if (stats.isDirectory) {
修复后:
} else if (stats.isDirectory()) {
修复后的完整代码
//Require modules var http = require("http"); var url = require("url"); var path = require("path"); var fs = require("fs"); var mimeTypes = { html: "text/html", jpeg: "image/jpeg", png: "image/png", jpg: "image/jpg", js: "text/javascript", css: "text/css", }; http .createServer(function (req, res) { var uri = url.parse(req.url).pathname; var fileName = path.join(process.cwd(), unescape(uri)); // 修复这里 console.log("Loading " + uri); var stats; try { stats = fs.lstatSync(fileName); } catch (error) { res.writeHead(404, { "Content-type": "text/plain" }); res.write("404 not Found"); res.end(); return; } if (stats.isFile()) { var mimeType = mimeTypes[path.extname(fileName).split(".").reverse()[0]]; res.writeHead(200, { "Content-type": mimeType }); var fileStream = fs.createReadStream(fileName); fileStream.pipe(res); } else if (stats.isDirectory()) { // 修复这里 res.writeHead(302, { location: "index.html" }); res.end(); } else { res.writeHead(500, { "Content-Type": "text/plain" }); res.write("500 Internal Error"); res.end(); } }) .listen(3000);
验证错误来源
你终端里的错误栈已经明确指向了path.join那一行:
at Object.join (path.js:375:7)
at Server.(C:\Users\User\Desktop\Codes\html workspace\node_temp\simpleserver\server.js:20:25)
这说明path.join的第一个参数不是字符串,而是process.cwd这个函数对象,所以抛出了类型错误。
内容的提问来源于stack exchange,提问作者Naman Dutta




