@H_404_0@最近公司的一个开发项目,后端用的是nodejs。这两天需要打包给客户演示,就让公司一个小伙把之前3D机房的打包工具移植过来。打包之后,发现原本在开发环境下的跑的好好的项目,不能访问了。出现项目的首页不能访问的问题:
@H_404_0@can not get file index.html@H_404_0@
express.static
@H_404_0@问题出在哪儿? @H_404_0@nodejs后端的用了express,index.html是一个静态文件。我们知道,通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。 @H_404_0@将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JavaScript 文件,可以使用如下代码:express.static方法解析
@H_404_0@事实上,express.static方法如果传入的是相对路径,express会自己把他转换为绝对路径,我们可以查看下源代码,在express.js找到如下代码:path对象的resolve方法
@H_404_0@直接查看这个方法的api文档,如下:https://nodejs.org/api/path.html#path_path_resolve_paths @H_404_0@下面是这个方法的解释:@H_404_0@The path.resolve() method resolves a sequence of paths or path segments into an absolute path.@H_404_0@啥意思呢? 就是这个方法把一系列的paths或者path segments 组织成一个绝对路径,比如
@H_404_0@If after processing all given path segments an absolute path has not yet been generated,the current working directory is used.@H_404_0@啥意思,就是如果处理完了所有的path segments,也没有生成一个绝对路径, 就要使用 当前工作目录(current working directory)。比如:
加上 /Users/terry 是当前工作目录, return /Users/terry/bar
@H_404_0@api文档中一个比较复杂的示例(此处注意resolve的时候,从右到左,参考文档了解详情):
nodejs 当前工作目录 current working directory
@H_404_0@nodejs 当前工作目录是启动Node的目录。也就是说,从哪个目录进去启动node,就返回哪个目录。 @H_404_0@注意,这个目录不是指js文件所在的目录 @H_404_0@通过process.cwd()方法可以获取当前工作目录。 @H_404_0@下面通过一个示例来介绍这个当前工作目录,假如在/Users/terry/Documents/JSWorkspace目录下写一个js文件,test.js,代码只有一行:如何解决
@H_404_0@解决的方法:
@H_404_0@1.在前面已经说过了,改这个相对目录。但这种方法很蹩脚。因为,启动node命令的目录可能会变;而是如果这应该,开发阶段的node命令执行也需要跟着改。 总之不是兼容性很好的方法。 @H_404_0@2.直接使用绝对路径。 但是这个绝对路径在不同的机器上又不一样,该如何解决呢?可以考虑使用全局变量__dirname. @H_404_0@全局变量__dirname
@H_404_0@查看api文档 https://nodejs.org/api/modules.html#modules_dirname @H_404_0@看到解释如下:@H_404_0@The directory name of the current module. This is the same as the path.dirname() of the __filename。@H_404_0@啥意思呢,及时返回nodejs 的js文件的所在目录。 @H_404_0@有了这个变量之后,我们就可以用如下代码解决这个问题。