`
flyfox1982
  • 浏览: 80891 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

nodejs的路径问题

阅读更多

最近公司的一个开发项目,后端用的是nodejs。这两天需要打包给客户演示,就让公司一个小伙把之前3D机房的打包工具移植过来。打包之后,发现原本在开发环境下的跑的好好的项目,不能访问了。出现项目的首页不能访问的问题:

can not get file index.html

express.static

问题出在哪儿?
nodejs后端的用了express,index.html是一个静态文件。我们知道,通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。
将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JavaScript 文件,可以使用如下代码:

app.use(express.static('public'));

所以,找到项目中的代码,查看static调用的地方,和上面一行代码很一样:

app.use(express.static('public'));

到此,我已经发现了问题,我告诉小伙伴,这个地方不用相对路径可以解决这个问题。由于打包时间限制,我让小伙伴先简单处理下,打完包之后,在来整理下思路:

app.use(express.static('resource/public'));

当然最重要的是,这个问题其实不难,自己多钻研下,很容易发现问题,也就不会出这个问题,所以小伙伴自己打手心吧。

恩,你没看错,这个地方还是相对目录。后续产品中会改成比较好的一种情况。

express.static方法解析

事实上,express.static方法如果传入的是相对路径,express会自己把他转换为绝对路径,我们可以查看下源代码,在express.js找到如下代码:

exports.static = require('serve-static');

说明static 调用了serve-static这个包,直接找到这个包,查看index.js, 可以看到代码,下面列出重要的两行

...
var resolve = require('path').resolve
...
opts.root = resolve(root)
...

这两行就是,express把相对目录转换成绝对目录的代码,可以看出,最终使用的path这个内置对象的resolve方法,继续往下看。

path对象的resolve方法

直接查看这个方法的api文档,如下:
https://nodejs.org/api/path.html#path_path_resolve_paths
下面是这个方法的解释:
The path.resolve() method resolves a sequence of paths or path segments into an absolute path.
啥意思呢? 就是这个方法把一系列的paths或者path segments 组织成一个绝对路径,比如

path.resolve('/foo','bar');
// return /foo/bar

详细的说明请自行参考文档,这个地方有一句话需要特别注意:
If after processing all given path segments an absolute path has not yet been generated, the current working directory is used.
啥意思,就是如果处理完了所有的path segments,也没有生成一个绝对路径, 就要使用 当前工作目录(current working directory)。比如:

path.resolve('bar');
// 加上 /Users/terry 是当前工作目录, return /Users/terry/bar

api文档中一个比较复杂的示例(此处注意resolve的时候,从右到左,参考文档了解详情):

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// if the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

现在的问题是,啥是当前工作目录。

nodejs 当前工作目录 current working directory

nodejs 当前工作目录是启动Node的目录。也就是说,从哪个目录进去启动node,就返回哪个目录。

注意,这个目录不是指js文件所在的目录
通过process.cwd()方法可以获取当前工作目录。

下面通过一个示例来介绍这个当前工作目录,假如在/Users/terry/Documents/JSWorkspace目录下写一个js文件,test.js,代码只有一行:

console.log(process.cwd());

此时如果,在目录/Users/terry/Documents/JSWorkspace下面执行命令 :node test.js 输出如下:

/Users/terry/Documents/JSWorkspace

但是如果在在目录/Users/terry/Documents/下面执行命令:node ./JSWorkspace/test.js,输出的结果是:

 /Users/terry/Documents

因此可以看出你在那个目录执行node命令,当前目录就是那个目录。

回到之前的打包的问题,由于在开发阶段,一般都是直接在js文件所在目录执行node命令,所以相对目录写的是相对于当前js文件的目录没有问题。
可是打包之后,node的执行放到了js目录的上一层去了。此时相对目录“public”不在是相对于js文件的相对目录,而是相对于上一层的,自然就找不到这个文件夹了,从而也找不到该文件夹下的index.html文件。

如何解决

解决的方法:

  1. 在前面已经说过了,改这个相对目录。但这种方法很蹩脚。因为,启动node命令的目录可能会变;而是如果这应该,开发阶段的node命令执行也需要跟着改。 总之不是兼容性很好的方法。
  2. 直接使用绝对路径。 但是这个绝对路径在不同的机器上又不一样,该如何解决呢?可以考虑使用全局变量__dirname.

全局变量__dirname

查看api文档 https://nodejs.org/api/modules.html#modules_dirname
看到解释如下:
The directory name of the current module. This is the same as the path.dirname() of the __filename
啥意思呢,及时返回nodejs 的js文件的所在目录。
有了这个变量之后,我们就可以用如下代码解决这个问题。

app.use(express.static(__dirname + '/public'));

更多精彩内容,请关注公众号。

 

ITman彪叔公众号
ITman彪叔公众号
0
0
分享到:
评论

相关推荐

    nodejs的路径问题的解决

    最近公司的一个开发项目,后端用的是nodejs。这两天需要打包给客户演示,就让公司一个小伙把之前3D机房的打包工具移植过来。打包之后,发现原本在开发环境下的跑的好好的项目,不能访问了。出现项目的首页不能访问的...

    浅谈NodeJS中require路径问题

    学习Nodejs也是出于对这个新产物的好奇,而且有两个重要项目也需要他的支持,所以要好好学学这个新语种。在nodejs中,模块大概可以分为核心模块和文件模块。核心模块是被编译成二进制代码,引用的时候只需require...

    NodeJS整理手册文档

    4. Path模块:提供与操作系统无关的路径处理函数,如解析、合并路径等。 5. Stream模块:处理数据流,如读取文件、网络传输等,采用可读/可写流实现高效的数据处理。 三、NodeJS进阶特性 1. NPM(Node Package ...

    NodeJS 安装包

    安装过程中,用户可以选择自定义安装路径,设置环境变量,以及是否在系统 PATH 中添加 NodeJS 的可执行文件路径,这样就可以在命令行中直接运行 `node` 和 `npm` 命令。 在安装完成后,用户可以使用 NodeJS 来编写...

    NodeJS开发指南_nodejs开发指南_

    1. 内置模块:NodeJS提供了一些内置模块,如`fs`(文件系统)、`http`(HTTP服务器)、`path`(路径处理)等。 2. 第三方模块:通过npm,可以安装和管理大量的第三方模块,例如`express`(Web框架)、`axios`(HTTP...

    NodeJS示例

    2. 安装过程中,你可以选择自定义安装路径,例如 `C:\Program Files\nodejs`。默认情况下,安装程序会自动将 NodeJS 添加到系统环境变量中,使得在任何目录下都可以通过命令行调用 `node` 和 `npm` 命令。 3. 安装...

    NodeJS安装及环境配置(windows)

    2. 接下来,打开命令提示符(cmd),输入以下两条命令来设置 npm 的全局路径和缓存路径: ``` npm config set prefix "D:\Develop\nodejs\node_global" npm config set cache "D:\Develop\nodejs\node_cache" ``...

    浅析 NodeJs 的几种文件路径

    总结起来,理解和正确使用Node.js中的文件路径至关重要,这有助于避免在开发过程中遇到的路径问题。为了减少路径解析的困扰,建议在编写代码时遵循以下原则: - 在模块导入(`require()`)时,使用相对路径,以确保...

    Nodejs基础知识

    在Nodejs中,文件和模块是一一对应的,而模块有不同的类型,大概可分为核心模块----文件模块----第三方模块,引用模块的几种方式,可以通过文件路径来引用模块,也可以通过模块名来引用如果用模块来引用非核心模块的...

    nodejs安装及环境配置介绍

    nodejs安装及环境配置。一、下载Node.js 首先,你需要在Node.js的官方网站下载对应你电脑系统(Windows、macOS、Linux等)的安装包。 二、安装Node.js 双击你下载的.msi(Windows)或.pkg(macOS)文件开始安装。 ...

    Linux Centos7.2下安装nodejs&npm配置全局路径的教程

    本文将详细讲解如何在CentOS 7.2版本的Linux系统中安装node.js及npm,并配置它们的全局路径。 首先,要想在Linux环境下安装node.js,需要先访问node.js官方网站获取安装包。官网提供的下载页面上通常会有多个版本供...

    nodejs fs 获得本地资源路径下面的所有文件

    nodejs fs 获得本地资源路径下面的所有文件,用递归的方式写的。主要是要用到 ftp ,由于需要上传 整个文件夹,就需要把所需要的文件夹下面文件一一获得。诶这东西太浪费时间了,分享只为求分!

    NodeJS安装包及教程.zip

    安装此MSI文件时,系统会引导用户完成一系列步骤,包括接受许可协议、选择安装路径、配置环境变量等,最后完成安装,使用户能够在命令行中使用`node`和`npm`(Node Package Manager)这两个核心工具。 "NodeJS安装...

    nodejs 客户端音乐播放器

    访问官方网站`https://nodejs.org/`下载并安装适合你操作系统的版本。安装完成后,通过在命令行输入`node -v`来验证安装是否成功,正常情况下会显示当前Node.js的版本号。 2. **理解npm**: npm(Node Package ...

    jdk8 NodeJS16.20

    此外,`PATH`环境变量也需更新,添加Node.js的可执行文件路径,如`C:\Program Files\nodejs`(Windows)或`/usr/local/bin`(Unix-like系统)。 环境变量的正确配置对于JDK 8和Node.js 16.20的使用至关重要,因为...

    NodeJs实现读取目录文件,以及文件批量生成

    NodeJs实现读取目录文件(node dir_new list),以及文件批量生成(node dir_new)

    NodeJS学习手册

    回调函数是NodeJS处理异步操作的主要方式,但同时也带来了回调地狱的问题,为解决这个问题,后来出现了Promise和async/await等技术。 2. **核心模块**:NodeJS内置了许多核心模块,如fs(文件系统)用于读写文件,...

    详解nodeJS之路径PATH模块

    path模块包含一系列处理和转换文件路径的工具集,通过 require(‘path’) 可用来访问这个模块。本文将详细介绍path模块 路径组成 【path.dirname(p)】 返回路径p所在的目录 var path = require('path'); console....

Global site tag (gtag.js) - Google Analytics