nodejs的门道难点的消除,的两种文件路线

By admin in 4858美高梅 on 2019年5月25日

近期厂家的一个付出项目,后端用的是nodejs。那二日内需打包给客户演示,就让集团三个青少年把后边3D机房的包裹工具移植过来。打包之后,发掘原本在开荒情况下的跑的佳绩的品种,不可能访问了。出现项目标首页不能访问的难题:

近几来厂商的3个开销项目,后端用的是nodejs。那二日内需打包给客户演示,就让公司贰个青少年把后面3D机房的包装工具移植过来。打包之后,开掘原来在支付条件下的跑的理想的花色,不可能访问了。出现项指标首页不能够访问的主题材料:

4858美高梅 1

一、挖坑 & 掉坑:

can not get file index.html

can not get file index.html

  那是大牌的源码,个中那几个path.resolve(__dirname,'./src')甚是令人费解。
通过1番上学,那一个主题素材得以拆分为多个知识点:
1.path.resolve( )方法
2.__dirname变量

缘起1段这样的代码:

express.static

主题素材出在哪里?nodejs后端的用了express,index.html是贰个静态文件。大家知道,通过
Express 内置的 express.static
能够便宜地托管静态文件,举例图片、CSS、JavaScript
文件等。将静态财富文件所在的目录作为参数字传送递给 express.static
中间件就足以提供静态能源文件的走访了。比方,要是在 public
目录放置了图片、CSS 和 JavaScript 文件,能够使用如下代码:

先是来看率先个法子path.resolve( )方法,那是官方API文书档案表达:

4858美高梅 2

传播参数:...paths是传播的字符串参数,是路子体系或然路线片段。
返回值:字符串
运用办法:
一.path.resolve()方法能够将路线只怕路线片段剖判成相对路线
二.传到路线从右至左深入分析,遭受第四个相对路线是形成深入分析,比如path.resolve(‘/foo’,
‘/bar’, ‘baz’) 将回来 /bar/baz
三.万一传入的相对路线不存在,那么当前目录将被选拔
4.当传入的参数未有/时,将被传播剖析到方今根目录
五.零长短的渠道将被忽略
六.借使未有传到参数,将回来当前根目录
事例代码:
<pre>
path.resolve(‘/foo/bar’, ‘./baz’)
// Returns: ‘/foo/bar/baz’

path.resolve(‘/foo/bar’, ‘/tmp/file/’)
// Returns: ‘/tmp/file’

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’
</pre>
干什么会油不过生这么的结果:
一.传开路线从右至左分析,境遇第一个相对路线是瓜熟蒂落深入分析
二.”../”方法向前跳了一个索引
民用总计:
  path.resolve()是贰个修改和构成文件路线的办法。

fs.readFile('./docs/use.md', function (err, buffer) {
  if (err) {
   return console.log('error: ', err);
  }

  console.log('OK');
 });

标题出在何处?

app.use(express.static);

目前来看__dirname那些变量:

__dirname是__directory+name的缩写,看名称就能够想到其意义,是目录名的乐趣。

地点运营时整个 OK,线上布署时却死活找不到 ./docs/use.md
那一个文件,后来才察觉是因为线上运转应用时不是从当前目录运营了,不过为啥运转脚本的岗位也会潜移默化那一个路子呢,且往下看。

nodejs后端的用了express,index.html是二个静态文件。大家清楚,通过
Express 内置的 express.static
能够便宜地托管静态文件,比方图片、CSS、JavaScript 文件等。

由此,找到项目中的代码,查看static调用的地点,和上面一行代码很均等:

nodejs的门道难点的消除,的两种文件路线。talk is cheap , show you code:

那是a.js的品质页面,个中储存了它的路线详细新闻:

4858美高梅 3

那是大家的测试代码部分:

4858美高梅 4

那是运作结果:

4858美高梅 5

结果深入分析:
1.只传入__dirname也足以自动调用path.resolve方法
二.足以凑合路线字符串,可是不调用path.resolve()方法拼接战败
3.__dirname代表的是近日文件(a.js)的相对路线
4.从右至左深入分析,碰到了相对路线/src,因而一向回到

二、填坑:

将静态财富文件所在的目录作为参数字传送递给 express.static
中间件就足以提供静态财富文件的拜访了。比如,若是在 public
目录放置了图片、CSS 和 JavaScript 文件,能够使用如下代码:

app.use(express.static);

梦想那篇博客对大家有用!

Node 中的文件路线大致有 __dirname, __filename, process.cwd(), ./
可能 ../,前八个都以相对路线,为了便利相比,./ 和 ../ 大家经过
path.resolve(‘./’)来更改为相对路线。

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

到此,小编已经开掘了难点,小编报告小同伴,这几个地点不用相对路线可以消除那一个标题。由于包裹时间范围,作者让小同伴先轻松管理下,打完包之后,在来整理下思路:

4858美高梅 ,力图成为优良的会nodejs的前端技术员!

先看3个归纳的栗子:

于是,找到项目中的代码,查看static调用的地方,和地点1行代码很均等:

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

要是大家有这么的文书结构:

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

本来最要害的是,这几个标题实际上简单,自个儿多钻研下,很轻巧觉察难点,也就不会出那几个标题,所以小友人自身打手心吧。

app/ 
-lib/ 
-common.js 
-model 
-task.js 
-test.js 

到此,作者一度发掘了难点,笔者报告小伙伴,那个地点不用相对路径能够缓慢解决那一个主题素材。由于包裹时间限定,笔者让小伙伴先简单管理下,打完包之后,在来整理下思路:

恩,你没看错,这几个地方依然相对目录。后续产品中会改成相比较好的1种情景。

在 task.js 里编写如下的代码:

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

骨子里,express.static方法假如传入的是相对路线,express会本人把她转换为相对路线,大家得以查看下源代码,在express.js找到如下代码:

var path = require('path');

console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));

当然最重要的是,那么些难点莫过于轻易,本人多钻研下,很轻松开掘难题,也就不会出这几个难点,所以小友人本人打手心吧。

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

在 model 目录下运转 node task.js 获得的出口是:

恩,你没看错,这几个地点照旧绝对目录。后续产品中会改成相比好的1种境况。

表明static 调用了serve-static那些包,直接找到那么些包,查看index.js,
能够见到代码,上面列出首要的两行

/Users/guo/Sites/learn/app/model.js
/Users/guo/Sites/learn/app/model.js/task.js
/Users/guo/Sites/learn/app/model.js
/Users/guo/Sites/learn/app/model.js

express.static方法剖析

...var resolve = require.resolve...opts.root = resolve...

下一场在 app 目录下运维 node model/task.js,得到的出口是:

实在,express.static方法假设传入的是绝对路线,express会本人把她转变为相对路线,大家得以查看下源代码,在express.js找到如下代码:

那两行正是,express把相对目录调换到相对目录的代码,能够观望,最终利用的path那一个放手对象的resolve方法,继续往下看。

/Users/guo/Sites/learn/app/model.js
/Users/guo/Sites/learn/app/model.js/task.js
/Users/guo/Sites/learn/app
/Users/guo/Sites/learn/app
exports.static = require('serve-static');

平昔查看那个主意的api文档,如下:
path.resolve() method resolves a sequence of paths or path segments into
an absolute path.啥意思呢? 正是其一措施把一层层的paths大概path segments
组织成三个相对路线,比方

那便是说,不好意思不是主题素材来了~T_T,大家得以得出有个别浮泛的结论了:

表达static 调用了serve-static那几个包,直接找到那几个包,查看index.js,
能够见见代码,下边列出首要的两行

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

__dirname: 总是回到被实施的 js 所在文件夹的相对路线

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

详细的辨证请自行参照他事他说加以考察文书档案,那些地点有一句话须要特别注意: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)。比方:

__filename: 总是回到被施行的 js 的相对路线

那两行便是,express把相对目录调换来相对目录的代码,可以看来,最后使用的path那几个松开对象的resolve方法,继续往下看。

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

process.cwd(): 总是回到运转 node 命令时所在的文本夹的相对路径

path对象的resolve方法

api文书档案中贰个比较复杂的演示(此处注意resolve的时候,从右到左,参考文书档案理解详细情况):

./: 跟 process.cwd() 同样、同样、同样的啊?

一贯查看这些点子的api文书档案,如下:

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'

本人明明记得在 require(‘../lib/common’)
里一直都以各类相对路线写,也没发布什么错啊,大家还在再来个栗子吧,如故地点的布局,’model/task.js’
里的代码改成:

上边是那么些措施的表明:

近来的难点是,啥是当前职业目录。

var fs = require('fs');
var common = require('../lib/common');

fs.readFile('../lib/common.js', function (err, data) {
  if (err) return console.log(err);
  console.log(data);
});

The path.resolve() method resolves a sequence of paths or path
segments into an absolute path.

nodejs
当前专门的学问目录是开行Node的目录。也正是说,从哪些目录进去运维node,就回到哪个目录。

在 model 目录下运转 node task.js,1切 Ok,未有报错。然后在 app
目录下运维 node model/task.js,然后很泼辣滴报错了:

啥意思呢? 正是那个格局把一密密麻麻的paths大概path segments
协会成二个相对路线,比如

专注,这些目录不是指js文件所在的目录通过process.cwd()方法可以获得当前专门的学业目录。

那么那下难点的确都以来了,遵照上面包车型地铁论战,在 app
下运作时,../lib/common.js 会被转成
/Users/guo/Sites/learn/lib/common.js,那几个渠道显著是不设有的,可是从运维结果能够见见
require(‘../lib/common’) 是 OK 的,只是 readFile 时报错了。

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

上边通过叁个演示来介绍这么些当前专门的学问目录,假诺在/Users/terry/Documents/JSWorkspace目录下写一个js文件,test.js,代码惟有1行:

那么关于 ./ 准确的下结论是:

详细的表达请自行参谋文书档案,那个地点有一句话须求特别注意:

console.log(process.cwd;

在 require() 中利用是跟 __dirname
的效劳相同,不会因为运营脚本的目录分歧样而改换,在其它意况下跟
process.cwd() 效果同样,是相对于运维脚本所在目录的路径。

If after processing all given path segments an absolute path has not
yet been generated, the current working directory is used.

那儿壹经,在目录/Users/terry/Documents/JSWorkspace上边试行命令 :node
test.js 输出如下:

三、总结:

啥意思,正是借使管理完了具有的path segments,也从来不变化一个相对路线,
就要使用 当前专业目录(current working directory)。例如:

/Users/terry/Documents/JSWorkspace

只有在 require() 时才使用相对路线(./, ../)
的写法,其余地点1律使用相对路线,如下:

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

不过只要在在目录/Users/terry/Documents/上边试行命令:node
./JSWorkspace/test.js,输出的结果是:

// 当前目录下 
path.dirname(__filename) + ‘/test.js'; 
// 相邻目录下 
path.resolve(__dirname, ‘../lib/common.js'); 

api文书档案中3个相比复杂的示范(此处注意resolve的时候,从右到左,参照他事他说加以考查文档了然详细情况):

 /Users/terry/Documents

如上正是本文的全体内容,希望对我们的求学抱有协理,也期待大家多多补助脚本之家。

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'

从而得以看看你在老大目录实施node命令,当前目录正是相当目录。

您大概感兴趣的稿子:

  • Nodejs读取文件时相对路线的不错写法(使用fs模块)
  • nodejs的require模块(文件模块/宗旨模块)及路线介绍

于今的主题材料是,啥是当前专门的学问目录。

归来此前的打包的题材,由于在开垦阶段,一般都是直接在js文件所在目录实践node命令,所以相对目录写的是相对于近日js文件的目录没不平时。可是打包之后,node的实施放到了js目录的上1层去了。此时绝对目录“public”不在是争论于js文件的相对目录,而是相对于上壹层的,自然就找不到那几个文件夹了,从而也找不到该公文夹下的index.html文件。

nodejs 当前工作目录 current working directory

涸泽而渔的秘诀:

nodejs
当前工作目录是开发银行Node的目录。相当于说,从哪些目录进去运转node,就回去哪个目录。 

  1. 在前头已经说过了,改那些相对目录。但这种办法很稀松。因为,运转node命令的目录恐怕会变;而是只要那应该,开垦阶段的node命令实践也供给随着改。
    总之不是包容性很好的点子。
  2. 直接利用相对路线。
    不过其一相对路线在分裂的机器上又区别等,该如何消除呢?可以设想动用全局变量__dirname.

小心,那一个目录不是指js文件所在的目录

查看api文档

directory name of the current module. This is the same as the
path.dirname() of the __filename。啥意思呢,及时赶回nodejs
的js文件的大街小巷目录。有了那些变量之后,大家就可以用如下代码化解这几个标题。

经过process.cwd()方法能够获得当前职业目录。

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

下边通过2个示范来介绍那一个当前专业目录,假诺在/Users/terry/Documents/JSWorkspace目录下写八个js文件,test.js,代码只有1行:

越来越多美丽内容,请关切公众号。

console.log(process.cwd());

4858美高梅 6ITman彪伯公众号

那时候如若,在目录/Users/terry/Documents/JSWorkspace上面施行命令 :node
test.js 输出如下:

 /Users/terry/Documents/JSWorkspace

不过一旦在在目录/Users/terry/Documents/上面推行命令:node
./JSWorkspace/test.js,输出的结果是:

/Users/terry/Documents

所以得以看到你在11分目录实践node命令,当前目录正是卓殊目录。

回来在此以前的打包的题目,由于在开垦阶段,一般都以一直在js文件所在目录推行node命令,所以相对目录写的是对峙于当下js文件的目录没失常。

不过打包之后,node的推行放到了js目录的上一层去了。此时相对目录“public”不在是相对于js文件的冲突目录,而是相对于上一层的,自然就找不到这几个文件夹了,从而也找不到该文件夹下的index.html文件。

什么减轻

化解的主意:

1.在前方早已说过了,改那个相对目录。但这种格局很不佳。因为,运维node命令的目录恐怕会变;而是壹旦那应当,开采阶段的node命令执行也亟需随着改。
由此可见不是包容性很好的章程。

2.一向运用相对路线。
但是这几个相对路径在不相同的机器上又不一致,该怎么样化解吗?能够设想选用全局变量__dirname.

全局变量__dirname

查看api文档

探望解释如下:

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'));

如上便是本文的全体内容,希望对大家的上学抱有扶助,也冀望大家多多帮助脚本之家。

你也许感兴趣的篇章:

  • Node.js模块全局安装路线配置方式
  • nodejs取妥帖前实施路线的不二等秘书籍
  • 浅析 NodeJs
    的二种文件路线
  • 详解nodeJS之路径PATH模块
  • Nodejs读取文件时相对路线的科学写法(使用fs模块)
  • 详解NodeJS框架express的门路映射(路由)成效及调整
  • node.js与C语言
    完成遍历文件夹下最大的文件,并出口路线,大小
  • Node.js中路线管理模块path详解
  • 浅谈NodeJS中require路线难题
  • nodejs的require模块(文件模块/焦点模块)及路线介绍

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有