我创建了一个名为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';
这是为什么?如果要使用相对路径,该怎么办?
答案 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__)