node.js 读取文件 路径问题

clipboard.png

文件存放位置如图所示。
我再sever.js文件里,加载了static/model里的getmime.js模块

//sever.js文件
var mimeModle = require('./static/model/getmime.js');
var mimeFile = mimeModle.getMime(".html");
console.log(mimeFile); 

getmime.js文件里这么写:

//getmime.js文件
var fs = require("fs");
exports.getMime=function(extname){  /*获取后缀名的方法*/
    var Mime = fs.readFileSync("./static/model/mime.json");
    var Mimes=JSON.parse(Mime.toString());  /*把json字符串转换成json对象*/
    return Mimes[extname] || 'text/html';
}

问题在于getmime.js里,访问mime.json路径这块。这两个文件在同一个目录下,按理说,访问路径应该是./mime.json才是,但是这么写会报错,提示是在sever.js相同的那个目录下找不到文件。必须写成./static/model/mime.json这样才可以。怎么会出现这样的问题?

阅读 6.3k
5 个回答

fs.readFileSync('./')中的相对路径是相对于当前执行文件的,所以解决方案有两种:

  1. 使用__dirname,这个保存的是当前文件的目录
  2. 使用绝对路径(推荐)

    // 在入口文件
    const APP_PATH = path.resolve('.');
    // ...

应该是getTime被import到server.js文件了 所以从这个路径算起了
如果你直接在getmime.js文件夹下面运行 应该就是相对路径

那么关于 ./ 正确的结论是:

在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。

所以。。。
只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径

你应该是没有设置静态目录 app.use(express.static(__dirname))

其实,就这两种方案,一种是使用path.resolve,或path.join对所需要的引入的文件使用绝对路径;另种就是针对node项目中的hml文件中的引用静态文件,或者其它文件引用静态文件的情况指定静态文件的目录
app.use(express.static(path.join(__dirname, '静态文件目录路径')));

其实一般 nodejs 编程习惯里面, fs.readFileSync 传入的是一个路径变量,
这个变量不管是 path + process.cwd 或者上面说的其他之类的获取路径,建议养成好的编程习惯

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题