为什么Node.js只识别绝对路径?

时间:2019-06-21 18:00:07

标签: javascript html node.js npm server

我创建了一个名为node的文件,然后使用npm init对该文件进行了初始化,并且主js文件名为main.js。我还在文件中创建了index.html和index.css,之后我想使用Node.js渲染此index.html,所以我在main.js中写道:

const http = require('http');
const fs = require('fs');

const hostname = '127.0.0.1';
const port = 9000;
const mainHTML = './index.html';

const server = http.createServer((req, res) => {
  fs.stat(`./${mainHTML}`, (err, stats) => {
    if(stats) {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/html');
      fs.createReadStream(mainHTML).pipe(res);
    }
  });
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

我用node desktop/nodes命令打开了服务器,但是node.js找不到文件。

在我将相对路径更改为绝对路径之前,Node.js会识别它:

const mainHTML = 'desktop/nodes/index.html';

这是为什么?如果要使用相对路径,该怎么办?

2 个答案:

答案 0 :(得分:1)

当您使用相对路径访问node.js中的文件时,将相对于该进程当前工作目录的值来访问该文件。请注意,在node.js的模块化世界中,当前工作目录可能与模块所在目录相同,也可能不同。而且,您的代码可以将当前的工作目录更改为您想要的任何目录。

在模块化的node.js代码中,通常有一种编程愿望,即希望访问相对于加载当前模块代码的目录的事物。这使您能够使用相对路径,以便该应用程序/模块可以在任何地方运行,但可以确保您将获取所需的文件。为此,通常使用特定于模块的变量__dirname。这是从中加载当前模块的目录。如果那是启动node.js的主要脚本,那么它就是该脚本的目录。

因此,要从与当前脚本相同的目录中获取文件,请执行以下操作:

const mainHTML = 'index.html';
fs.createReadStream(path.join(__dirname, mainHTML)).pipe(res);

要访问脚本所在的子目录public中的文件,可以执行以下操作:

const mainHTML = 'public/index.html';
fs.createReadStream(path.join(__dirname, mainHTML)).pipe(res);

要访问与脚本所在位置处于同一级别(公共父目录)的其他子目录中的文件,可以执行以下操作:

const mainHTML = '../public/index.html';
fs.createReadStream(path.join(__dirname, mainHTML)).pipe(res);

所有这些使用路径都与脚本本身的位置有关,并且与模块/脚本的加载方式或应用程序的当前工作目录无关。

答案 1 :(得分:0)

您正在创建http服务器,该服务器将其路径创建为基本路径,因此它仅理解以该基本路径为相对路径的路径。如果要使用相对路径,则需要解析该路径。

您可以使用“路径”库。

const path = require('path')
// To resolve parent path
path.resolve('..', __dirname__)