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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章