理解Express express.static 和 __direname 及 __firename的含义

一:理解 app.use(express.static(__direname + '/public'));
将静态资源文件所在的目录作为参数传递给 express.static中间件就可以提供静态资源文件的访问,比如在public目录放了css,images, 和 javascript文件,我们就可以如上的写法。
当然我们也可以如下写法:
app.use(express.static(path.join(__dirname, 'public')));

先看下项目的目录结构如下:

### 目录结构如下:
demo # 工程名
| |--- public
| | |---js
| | | |-- index.js
| | |--- index.css
| | |--- index.html
| |--- server.js
| |--- .gitignore

server.js 代码如下:

var express = require('express');

var app = express();

var path = require('path');

app.use(express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
res.send("aaa");
}); app.listen(3000, (req, res) => {
console.log('app is running at port 3000');
});

使用命令行,进入项目的根目录后,输入命令 node server.js 后,启动服务器;

那么现在我们就可以这样访问文件了;
http://127.0.0.1:3000/js/index.js
http://127.0.0.1:3000/index.css

如果我们的静态资源放在多个目录下面,我们可以多次调用express.static中间件;如:

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'common')));

如果我们希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,
可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:

app.use('/static', express.static(path.join(__dirname, 'public')));

那么现在访问资源文件变成如下:

http://127.0.0.1:3000/static/index.css
http://127.0.0.1:3000/static/js/index.js

二:理解__filename变量
在任何文件模块内部,可以使用__filename变量获取当前模块文件的带有完整路径的文件名。

比如现在在 server.js 代码加入如下代码:
var tt = require('./js/index.js');

然后在js/index.js 代码加入如下代码:

console.log(__filename);

在项目的根目录继续输入 node server.js , 在命令行中会显示完整的路径文件名:

/Users/tugenhua/个人demo/node0420/express-static/public/js/index.js

三: 理解__dirname变量
在任何模块文件内部,可以使用__direname变量获取当前模块文件所在目录的完整绝对路径。操作和上面一样,在index.js继续加入如下代码:
console.log(__dirname);
如下打印结果:

/Users/tugenhua/个人demo/node0420/express-static/public/js

github中demo

理解Express express.static 和 __direname 及 __firename的含义的更多相关文章

  1. 深入理解final和static关键字

    深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...

  2. 理解 php new static

    今天在看 Laravel 的容器(Container)实现时,发现了这么一段突然不能理解的代码: ** * Set the globally available instance of the con ...

  3. nodejs-日常练习记录-使用express搭建static服务器.

    cd C:\wxg\test\node_demo\myapp nvmw use 0.12.1 node static.js var express = require('express'); var ...

  4. 深入理解java的static关键字

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...

  5. 简单理解JVM与static{}

    参考如下 http://www.cnblogs.com/lao-liang/p/5110710.html http://blog.csdn.net/newjerryj/article/details/ ...

  6. [Node.js]24. Level 5: Express, Express routes

    Create an express route that responds to GET requests at the URL /tweets that responds with the file ...

  7. 内联函数:static inline 和 extern inline 的含义

    引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数是一种更高级的抽象.它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现:函数的引入可以减少程序的目标代码,实现程序代 ...

  8. C#中static void Main(string[] args)的含义

    static:是将main方法声明为静态的. void:说明main方法不会返回任何内容. String[]args:这是用来接收命令行传入的参数,String[]是声明args是可以存储字符串数组. ...

  9. Express static 托管静态文件 理解

    今天偶尔看了一下服务端渲染,遇到了express.static, 在以前学习webpack配置服务端渲染时,也使用express.static 中间件,两者配置不太一样,由于当时也没有认真学,所以 一 ...

随机推荐

  1. 【Java】包,jar包的扫描

    包扫描在框架中应用很广泛,在spring中,通过给自己的类加注解的方式,利用spring的包扫描,完成依赖注入. package com.test.package_scanner.core; impo ...

  2. Java学习笔记之——变量与数据类型、运算符

    一.变量 1.变量:变化的值 变量在代码运行期间,开辟了一块空间 .这块空间是有地址的,给这块取了个名字, 这个名字就叫做变量名,这块空间放的东西叫做变量值 2.变量的初始化: (1)先声明再赋值: ...

  3. 【Dubbo&&Zookeeper】4、 Java实现Dubbo服务提供者及消费者注册

    转自:http://blog.csdn.net/u010317829/article/details/52128852 创建Mavn工程.HelloDubbo. pom.xml添加dubbo及spri ...

  4. MEF 插件式开发之 DotNetCore 中强大的 DI

    背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framewor ...

  5. Linux Shell脚本编程case条件语句

    1,判断一个数字是否则在1,2,3之中. #!/bin/bash read -p "pls input a number:" n case "$n" in ) ...

  6. 在JSP中获取oracle中的时间戳类型的字段并显示

    在oracle中有一种特殊的时间显示类型——Timestamp时间戳 通常我们将当前时间转化为时间戳的语法如下: select cast (sysdate as timestamp ) from du ...

  7. python之约束, 异常处理, md5

    1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError (重点) 2. 抽象类和抽象方法 # 语法 # from abc import ABCMet ...

  8. Kotlin入门(5)字符串及其格式化

    上一篇文章介绍了数组的声明和操作,包括字符串数组的用法.注意到Kotlin的字符串类也叫String,那么String在Java和Kotlin中的用法有哪些差异呢?这便是本文所要阐述的内容了. 首先要 ...

  9. python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义

    本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...

  10. json替换jsonp实现跨域请求

    最近遇到h5前端页面和web后端双方的请求存在跨域,普通的jquery.ajax请求已不能实现(因为js是不允许跨域的(如果可以跨域,那就能随便改别人的网页了),js的原理), 最后经过艰苦奋斗,终于 ...