node.js学习笔记(六)ES6反撇号(`)基础知识 文件操作路径 Express修改完代码自动重启 Express中app.use()用法 在express中使用art-template

反撇号(`)基础知识

ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings)。除了使用反撇号字符 ` 代替普通字符串的引号 ’ 或 " 外,它们看起来与普通字符串并无二致。在最简单的情况下,它们与普通字符串的表现一致:

context.fillText(`Ceci n'est pas une chaîne.`, x, y);

但是我们并没有说:“原来只是被反撇号括起来的普通字符串啊”。模板字符串名之有理,它为JavaScript提供了简单的字符串插值功能,从此以后,你可以通过一种更加美观、更加方便的方式向字符串中插值了。

模板字符串的使用方式成千上万,但是最让我会心一暖的是将其应用于毫不起眼的错误消息提示:

function authorize(user, action) {
  if (!user.hasPrivilege(action)) {
    throw new Error(
      `用户 ${user.name} 未被授权执行 ${action} 操作。`);
  }
}

在这个示例中,user.name{user.name}和{action}被称为模板占位符,JavaScript将把user.name和action的值插入到最终生成的字符串中,例如:用户jorendorff未被授权打冰球。(这是真的,我还没有获得冰球许可证。)

到目前为止,我们所了解到的仅仅是比 + 运算符更优雅的语法,下面是你可能期待的一些特性细节:

模板占位符中的代码可以是任意JavaScript表达式,所以函数调用、算数运算等这些都可以作为占位符使用,你甚至可以在一个模板字符串中嵌套另一个,我称之为模板套构(template inception)。
如果这两个值都不是字符串,可以按照常规将其转换为字符串。例如:如果action是一个对象,将会调用它的.toString()方法将其转换为字符串值。
如果你需要在模板字符串中书写反撇号,你必须使用反斜杠将其转义:\``等价于""。
同样地,如果你需要在模板字符串中引入字符$和{。无论你要实现什么样的目标,你都需要用反斜杠转义每一个字符:\$\{
与普通字符串不同的是,模板字符串可以多行书写:

$("#warning").html(`
  <h1>小心!>/h1>
  <p>未经授权打冰球可能受罚
  将近${maxPenalty}分钟。</p>
`);

模板字符串中所有的空格、新行、缩进,都会原样输出在生成的字符串中。

文件操作路径

文件操作中的相对路径./可以省略
所有文件操作的API都是异步的,就像ajex请求一样
如果在文件操作中
最前面是/
那么系统默认行为从磁盘根目录开始
最前面是./
是相对于当前目录,等于什么也不加

Express修改完代码自动重启

使用第三方命令行工具

npm install --global nodemon

之后使用nodemon启动js文件即可

Express中app.use()用法

app.use(path,callback)中的callback既可以是router对象又可以是函数
app.get(path,callback)中的callback只能是函数

当一个路由有好多个子路由时用app.use(path,router)
例子:
http://localhost:3000/home/one
http://localhost:3000/home/second
http://localhost:3000/home/three
路由/home后面有三个子路由紧紧跟随,分别是/one,/second,/three
如果使用app.get(),则要不断的重复,很麻烦,也不利用区分

app.get("/home",callback)
app.get("/home/one",callback)
app.get("/home/second",callback)
app.get("/home/three",callback)
我们可以创建一个router.js 专门用来一个路由匹配多个子路由

var express = require('express')
var router = express.Router()
router.get("/",(req,res)=>{
    res.send("/")
})
router.get("/one",(req,res)=>{
    res.send("one")
})
router.get("/second",(req,res)=>{
    res.send("second")
})
router.get("/treen",(req,res)=>{
    res.send("treen")
})
module.exports = router;

在app.js中导入router.js

var express = require('express')
var router = require("./router")
var app = express()

app.use('/home',router) //router路由对象中的路由都会匹配到"/home"路由后面
app.get('/about', function (req, res) {
  console.log(req.query)
  res.send('你好,我是 Express!')
})

// 4 .启动服务

app.listen(3000, function () {
  console.log('app is running at port 3000.')
})

那么,什么时用app.use,什么时用app.get呢?

路由规则是app.use(path,router)定义的,router代表一个由express.Router()创建的对象,在路由对象中可定义多个路由规则。可是如果我们的路由只有一条规则时,可直接接一个回调作为简写,也可直接使用app.get或app.post方法。即
当一个路径有多个匹配规则时,使用app.use()

app.use(express.static(‘public’));
为了提供对静态资源文件(图片,css,js文件)的服务,请使用Express内置的中间函数express.static.

传递一个包含静态资源的目录给express.static中间件用于立即开始提供文件。 比如用以下代码来提供public目录下的图片、css文件和js文件:
app.use(express.static(‘public’));

如果前台想请求后台public目录下images/08.jpg静态的图片资源
通过: http://localhost:3000/images/08.jpg

通过多次使用 express.static中间件来添加多个静态资源目录:

app.use(express.static(‘public’));
app.use(express.static(‘file’));
Express将会按照你设置静态资源目录的顺序来查看静态资源文件。

为了给静态资源文件创建一个虚拟的文件前缀(文件系统中不存在),可以使用express.static函数指定一个虚拟的静态目录,如下:

app.use(’/static’, express.static(‘public’))
现在你可以使用‘/static’作为前缀来加载public文件夹下的文件了

比如: http:// localhost:3000/static/image/kitten.jpg

在express中使用art-template模板引擎

npm install --save art-template express-art-template

var express=require('express')

var app=express()

//配置使用art-template模板引擎\
//第一个参数表示当渲染以.art结尾的文件的时候,使用art-template模板引擎
//需要同时安装art-template包和依赖express-art-template
app.engine('art',require('express-art-template'))
//express为response相应对象提供了一个方法:render,默认是不可以使用的,但是如果配置了模板引擎就可以使用了
//res.render('html模板名',{模板数据})第二个参数是可选的
//第一个参数不能写路径,默认会去项目中的view 目录查找模板文件
//也就是说express有一个约定,开发人员吧所有视图文件都放在views目录中
app.get('',function(req,res){
    res.send('/page')
})
//而且,为了更好辨识,html文件后缀名要改成art,标识这个文件将要被art模板引擎编译渲染
//如果不这样更改,那么意味着所有链接下html都会使用art-template渲染
app.get('/',function(req,res){
    res.render('404.html')
})
app.get('/admin',function(req,res){
    res.render('admin/index.html',{
        title:'管理系统'
    })
})
//如果想要修改默认views目录
app.set('views',render函数的默认路径)
app.get('/post',function(req,res){
    res.send('/post page')
})

app.listen(3000,function(){
    console.log('running')
})
//引包
//注意,express自动处理了编码问题
var express=require('express')
//创建服务器应用程序
//相当于http.creatSerive
var app=express()
//公开指定目录,可以通过路径变成url访问
//为了给静态资源文件创建一个虚拟的文件前缀(实际上文件系统中并不存在) ,
//可以使用 express.static 函数指定一个虚拟的静态目录,就像下面这样:
//一般不起别名
//app.use('/static', express.static('public'));
//app.use('/public/',express.static('./public/'))
//这一种方式可以省略第一个参数
app.use(express.static('./public/'))
//直接访问文件中的资源
//app.use(express.static('public'))
//当服务器收到get请求/时,执行回调处理函数function
app.get('/',function(req,res){
    //原来的api依然存在,如:
    // res.write('hello')
    // res.end()
    //但是推荐使用express提供的接口
    res.send(`
    helloworld
    `)
})

app.listen(3000,function(){
    console.log('app is running  at port')
})
发布了136 篇原创文章 · 获赞 14 · 访问量 5811
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章