You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动