zoukankan      html  css  js  c++  java
  • nodejs问题整理--fs.exists无法正确判断文件的问题

    fs.exists方法

    方法说明:

    测试某个路径下的文件是否存在。回调函数包含一个参数exists,true则文件存在,否则是false。

    语法:

    fs.exists(path, callback)

    由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) )

    接收参数:

    path 欲检测的文件路径,

    callback 回调

    例子1:

    代码如下:

    fs.exists('/etc/passwd', function (exists) {
      util.debug(exists ? "it's there" : "no passwd!");
    });

    以上是笔者在网上查到语法和示例,但是实际使用的时候却发现了问题!

    问题代码与解决

    例子2:

    代码如下:(此代码也是网上示例)

    http.createServer(function(req, res){
        var reqPath = url.parse(req.url).pathname;
        
        fs.exists(reqPath, function(exists){
            if(!exists){
                consloe.log(reaPath + ' not exists.');
            }else{
              //do something
            }
        });
    });

    服务端调用后会提示 xxx not exists。不论这个文件是否存在都会提示这个错误。这明显是fs.exists这个回调参数都会false,才会出现这个情况,也就是说这个路径下文件无法找到相应文件。我们用console.log将reqPath打印出来,如下:

    /index.html

    目录中文件的确存在,可是为何提示不存在那?笔者通过查询网上回答和参阅资料发现了问题

    fs.exists方法中参数path默认情况下路径是根目录开始完整路径,也就是文件的绝对路径。

    所以例子1中,参数path使用的是'/etc/passwd',熟悉Linux的都知道etc是Linux服务器根目录下几个目录之一。

    找到了问题,下面我们看解决方法:

    方法1:

    在为参数path前面加个. 或者__dirname,如示例中的console返回的实际地址就是'./index.html'或'__dirname/index.html'。

    在nodejs中./xxxx指的是当前目录,__dirname指的是获取当前模块文件所在目录的完整绝对路径(适用于调用此方法的文件目录与网站目录不同情况),具体用法可以自行百度。

    代码可修改为:

    http.createServer(function(req, res){
        var reqPath = url.parse(req.url).pathname;
        var realPath = '.'+reqPath;//var realPath = __dirname+reqPath;
        fs.exists(realPath, function(exists){
            if(!exists){
                consloe.log(reaPath + ' not exists.');
            }else{
              //do something
            }
        });
    });

    方法2:

    使用path.join返回拼接后的路径,如示例2中可加入var realPath = path.join("/usr/www", reqPath),笔者的web服务器端完整目录是/usr/www,所以将这个目录拼接上,之所以使用这个方法是可以正确的使用当前系统的路径分隔符,兼容两种系统。使用方法如下:

    path.join([path1][, path2][, ...])用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是"/",Windows系统是""。

    代码可修改为:

    http.createServer(function(req, res){
        var reqPath = url.parse(req.url).pathname;
        var realPath = path.join('/usr/www',reqPath);
        fs.exists(realPath, function(exists){
            if(!exists){
                consloe.log(reaPath + ' not exists.');
            }else{
              //do something
            }
        });
    });

    以上两种方法都可以在目录正确和文件存在的情况下,正确的执行do something了。

    nodejs新手,如有错误之处,请见谅。如帮忙指出,更是不胜感激。

  • 相关阅读:
    kendoGrid edit功能
    kendoGrid Event事件
    你不得不看的81条JavaScript编码小技巧,吐血整理,建议收藏
    H265编码视频流媒体播放器EasyPlayer.js支持9宫格视频同屏播放的写法
    EasyNTS 交叉编译海思系统下的可执行程序实现及测试过程
    EasyNTS在Go1.15版本下linux下无法编译的问题优化
    TSINGSEE青犀视频开发Python3行人分析功能运行一段时间后崩溃是什么原因?
    Mysql数据库导入excel和乱码问题
    聊聊5G:5G技术的落地能给视频娱乐、VR直播带来怎样的潜力?
    企业直播的核心点在哪里?未来将如何发展?
  • 原文地址:https://www.cnblogs.com/dashiyun/p/6222586.html
Copyright © 2011-2022 走看看