Nodejs 路径问题,奇怪不解。

Nodejs 路径问题,奇怪不解。

做个小测试: nodejs项目目录结构 nodetest/ index.js handle.js package.json public/template.html

var http = require('http');
var handler=require('./writeResponse');
 http.createServer(function (request, response) {
        response.writeHeader(200,{'Content-Type':'text/html'});
      	handler.writeResponse(response);
    }).listen(3000);
    console.log('Server is Start!');


![writeResponse.js]

 var fs = require('fs');
 function writeResponse(res) {
    var temfile = './public/template.html';###注意这里的路径
    fs.exists(temfile, function (exist) {
        if (exist == true) {
            fs.readFile(temfile, {'encoding': 'utf8', 'flag': 'r'}, function (err, data) {
                data = data.replace(/{title}/g, 'This is Index Page![from template]');
                res.write(data);res.end();
            });
        } else {
            res.write('<h1>This is Error Page!'+temfile+'</h1>');
            res.end();
        }
    });
}
exports.writeResponse = writeResponse;

![package.json]
{
    "name": "nodetest",
    "version": "0.0.1",
    "main":"/index.js"
}
\n```


![问题是在nodetest目录下:”node index.js“程序运行良好
在nodetest上层目录运行:“node nodetest”  fs读取未能读取public/template.html文件。
请问含有package.json的文件包,包内的代码如何编码才能确保路径的正确?]我是新手,Why

6 回复

根据你的描述,你在不同目录下运行 node 命令时遇到了路径问题。具体来说,在 nodetest 目录下运行 node index.js 是正常的,但在其上级目录运行 node nodetest/index.js 时,无法找到 public/template.html 文件。

这个问题的核心在于相对路径的解析方式。当你在 nodetest 目录下运行 node index.js 时,./public/template.html 是相对于 index.js 的路径,因此可以正确地找到文件。但是,当你在上级目录运行 node nodetest/index.js 时,./public/template.html 变成了相对于上级目录的路径,这导致它找不到文件。

为了解决这个问题,你可以使用 Node.js 的内置模块 path 来生成绝对路径。这样无论你在哪个目录运行脚本,都能确保路径的正确性。

下面是修改后的代码:

// handle.js
const path = require('path');

function writeResponse(res) {
    const temfile = path.join(__dirname, 'public/template.html'); // 使用 path.join 构建绝对路径
    fs.exists(temfile, function (exist) {
        if (exist) {
            fs.readFile(temfile, { encoding: 'utf8' }, function (err, data) {
                if (err) {
                    res.write('<h1>Error reading file</h1>');
                    res.end();
                    return;
                }
                data = data.replace(/{title}/g, 'This is Index Page![from template]');
                res.write(data);
                res.end();
            });
        } else {
            res.write('<h1>This is Error Page!</h1>');
            res.end();
        }
    });
}

module.exports = { writeResponse };

在这个例子中,我们使用了 __dirname(当前模块的目录名)和 path.join() 方法来生成一个绝对路径。这确保了无论你在哪个目录运行脚本,temfile 都会指向正确的文件位置。

此外,你可以在 package.json 中指定 main 字段来确保入口文件的正确性:

{
    "name": "nodetest",
    "version": "0.0.1",
    "main": "index.js"
}

通过这些调整,你应该能够在任何目录下正常运行你的 Node.js 应用,并且不会遇到路径问题。


fs模块里的函数 的参数里 相对路径 都是相对于 process.cwd() 的
用__dirname 可以得到当前文件所在的目录

采用path模块混编 __dirname,fs模块是可以处理绝对路径的。

经典问题, requirefs 的相对路径问题, fs 推荐绝对路径寻址,稳定可靠

“main”:"/index.js"

这个入口文件路径是否写错了成绝对路径?应该是"./index.js"或"index.js"

当你在不同的工作目录下运行Node.js程序时,当前的工作目录(process.cwd())可能会导致路径解析错误。为了解决这个问题,你可以使用一些方法来确保路径的正确性。

示例代码

修改 writeResponse.js

你可以使用 __dirname 来获取当前模块的目录名,并将其与相对路径拼接起来:

var fs = require('fs');

function writeResponse(res) {
    var temfile = __dirname + '/public/template.html';
    fs.exists(temfile, function (exist) {
        if (exist) {
            fs.readFile(temfile, { encoding: 'utf8' }, function (err, data) {
                if (err) throw err;
                data = data.replace(/{title}/g, 'This is Index Page![from template]');
                res.write(data);
                res.end();
            });
        } else {
            res.write('<h1>This is Error Page! ' + temfile + '</h1>');
            res.end();
        }
    });
}

exports.writeResponse = writeResponse;

解释

  • __dirname: 这是一个全局变量,表示当前模块所在的目录名。使用它来构建绝对路径可以避免因工作目录不同而引起的路径问题。
  • 路径拼接: 使用字符串拼接的方式将 __dirname 和相对路径拼接成一个完整的路径。

这样无论你在哪个目录下运行 node 命令,路径都能正确解析到 public/template.html 文件。

总结

通过使用 __dirname 变量来构建路径,可以确保在不同的工作目录下运行Node.js程序时,路径解析的正确性。

回到顶部