国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Node.js之express框架學習心得

這篇具有很好參考價值的文章主要介紹了Node.js之express框架學習心得。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Node.js:顛覆傳統(tǒng)的服務(wù)器端開發(fā)

Node.js是基于Chrome V8引擎構(gòu)建的JavaScript運行時,它采用了完全不同的開發(fā)模型。Node.js使用事件驅(qū)動和非阻塞I/O的方式處理請求,通過單線程和異步機制,實現(xiàn)高效的并發(fā)處理。這意味著在Node.js中,一個線程可以處理數(shù)千個并發(fā)連接,大大提高了服務(wù)器的性能和可伸縮性。

一、認識Web框架

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

二、Express安裝

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

三、Express的基本使用

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')

// 1.創(chuàng)建express的服務(wù)器
const app = express()

// 客戶端訪問URL: /login和/home
app.post('/login', (req, res) => {
  // 處理login請求
  res.end('登錄成功, 歡迎回來~')
})

app.get('/home', (req, res) => {
  res.end('首頁的輪播圖/推薦數(shù)據(jù)列表~')
})

// 2.啟動服務(wù)器, 并且監(jiān)聽端口
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

四、認識中間件

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

4.1、注冊普通中間件

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')

const app = express()

// 總結(jié): 當express接收到客戶端發(fā)送的網(wǎng)絡(luò)請求時, 在所有中間中開始進行匹配
// 當匹配到第一個符合要求的中間件時, 那么就會執(zhí)行這個中間件
// 后續(xù)的中間件是否會執(zhí)行呢? 取決于上一個中間件有沒有執(zhí)行next

// 通過use方法注冊的中間件是最普通的/簡單的中間件
// 通過use注冊的中間件, 無論是什么請求方式都可以匹配上
// login/get
// login/post
// abc/patch
app.use((req, res, next) => {
  console.log('normal middleware 01')
  // res.end('返回結(jié)果了, 不要等了')
  next()
})

app.use((req, res, next) => {
  console.log('normal middleware 02')
})


// 開啟服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.2、注冊路徑匹配的中間件

const express = require('express')

const app = express()

// 注冊普通的中間件
// app.use((req, res, next) => {
//   console.log('match normal middleware')
//   res.end('--------')
// })

// 注冊路徑匹配的中間件
// 路徑匹配的中間件是不會對請求方式(method)進行限制
app.use('/home', (req, res, next) => {
  console.log('match /home middleware')
  res.end('home data')
})

app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.3、方法、路徑匹配的中間件

const express = require('express')

const app = express()


// 注冊中間件: 對path/method都有限制
// app.method(path, middleware)
app.get('/home', (req, res, next) => {
  console.log('match /home get method middleware')
  res.end('home data')
})


app.post('/users', (req, res, next) => {
  console.log('match /users post method middleware')
  res.end('create user success')
})


app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.4、匹配多個中間件

const express = require('express')

const app = express()

// app.get(路徑, 中間件1, 中間件2, 中間件3)
app.get('/home', (req, res, next) => {
  console.log('match /home get middleware01')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware02')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware03')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware04')
})

app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.5、中間件案例一

先匹配普通中間件,有next()才會繼續(xù)向下匹配

const express = require('express')

const app = express()

// 1.注冊兩個普通的中間件
app.use((req, res, next) => {
  console.log('normal middleware01')
  next()
})

app.use((req, res, next) => {
  console.log('normal middleware02')
  next()
})


// 2.注冊路徑path/method的中間件
app.get('/home', (req, res, next) => {
  console.log('/home get middleware01')
  next()
}, (req, res, next) => {
  console.log('/home get middleware02')
  next()
})

app.post('/login', (req, res, next) => {
  console.log('/login post middleware')
  next()
})


// 3.注冊普通的中間件
app.use((req, res, next) => {
  console.log('normal middleware03')
  next()
})

app.use((req, res, next) => {
  console.log('normal middleware04')
})


app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.6、中間件案例二

const express = require('express')

const app = express()

// 注冊兩個實際請求的中間件
// 案例一: 用戶登錄的請求處理 /login post => username/password
app.post('/login', (req, res, next) => {
  // 1.獲取本次請求過程中傳遞過來的json數(shù)據(jù)
  let isLogin = false
  req.on('data', (data) => {
    const dataString = data.toString()
    const dataInfo = JSON.parse(dataString)
    if (dataInfo.username === 'coderwhy' && dataInfo.password === '123456') {
      isLogin = true
    }
  })

  req.on('end', () => {
    if (isLogin) {
      res.end('登錄成功, 歡迎回來~')
    } else {
      res.end('登錄失敗, 請檢測賬號和密碼是否正確~')
    }
  })
})

// 案例二: 注冊用戶的請求處理 /register post => username/password
app.post('/register', (req, res, next) => {
    // 1.獲取本次請求過程中傳遞過來的json數(shù)據(jù)
    let isRegister = false
    req.on('data', (data) => {
      const dataString = data.toString()
      const dataInfo = JSON.parse(dataString)
      // 查詢數(shù)據(jù)庫中該用戶是否已經(jīng)注冊過
      isRegister = false
    })

    req.on('end', () => {
      if (isRegister) {
        res.end('注冊成功, 開始你的旅程~')
      } else {
        res.end('注冊失敗, 您輸入的用戶名被注冊~')
      }
    })
})

app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.7、中間件案例二(重構(gòu))

//下面這個代碼就相當于app.use(express.json())的原理,以后開發(fā)直接用app.use(express.json())

app.use((req, res, next) => {
  if (req.headers['content-type'] === 'application/json') {
    req.on('data', (data) => {
      const jsonInfo = JSON.parse(data.toString())
      req.body = jsonInfo
    })

    req.on('end', () => {
      next()
    })
  } else {
    next()
  }
})
const express = require('express')

const app = express()


// app.use((req, res, next) => {
//   if (req.headers['content-type'] === 'application/json') {
//     req.on('data', (data) => {
//       const jsonInfo = JSON.parse(data.toString())
//       req.body = jsonInfo
//     })

//     req.on('end', () => {
//       next()
//     })
//   } else {
//     next()
//   }
// })

// 直接使用express提供給我們的中間件
app.use(express.json())

// 注冊兩個實際請求的中間件
// 案例一: 用戶登錄的請求處理 /login post => username/password
app.post('/login', (req, res, next) => {
  console.log(req.body)
})

// 案例二: 注冊用戶的請求處理 /register post => username/password
app.post('/register', (req, res, next) => {
  console.log(req.body)
})

app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

4.8、中間件應用-urlencoded解析

const express = require('express')

// 創(chuàng)建app對象
const app = express()

// 應用一些中間件
app.use(express.json()) // 解析客戶端傳遞過來的json
// 解析傳遞過來urlencoded的時候, 默認使用的node內(nèi)置querystring模塊
// { extended: true }: 不再使用內(nèi)置的querystring, 而是使用qs第三方庫
app.use(express.urlencoded({ extended: true })) // 解析客戶端傳遞過來的urlencoded

// 編寫中間件
app.post('/login', (req, res, next) => {
  console.log(req.body)
  res.end('登錄成功, 歡迎回來~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

4.9、應用中間件 – 第三方中間件

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

//記錄日志
const fs = require('fs')
const express = require('express')
const morgan = require('morgan')

// 創(chuàng)建app對象
const app = express()

// 應用第三方中間件
const writeStream = fs.createWriteStream('./logs/access.log')
app.use(morgan('combined', { stream: writeStream }))

// 編寫中間件
app.post('/login', (req, res, next) => {
  res.end('登錄成功, 歡迎回來~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

單個文件上傳

const express = require('express')
const multer = require('multer')

// 創(chuàng)建app對象
const app = express()

// 應用一個express編寫第三方的中間件
const upload = multer({
  dest: './uploads'
})

// 編寫中間件
// 上傳單文件: singer方法
app.post('/avatar', upload.single('avatar') , (req, res, next) => {
  console.log(req.file)
  res.end('文件上傳成功~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})



4.9、中間件應用-多個文件上傳

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')
const multer = require('multer')

// 創(chuàng)建app對象
const app = express()

// 應用一個express編寫第三方的中間件
const upload = multer({
  // dest: './uploads'
  storage: multer.diskStorage({
    destination(req, file, callback) {
      callback(null, './uploads')
    },
    // 自定義文件名
    filename(req, file, callback) {
      callback(null, Date.now() + '_' + file.originalname)
    }
  })
})

// 編寫中間件
// 上傳單文件: single方法
app.post('/avatar', upload.single('avatar') , (req, res, next) => {
  console.log(req.file)
  res.end('文件上傳成功~')
})

// 上傳多文件: 
app.post('/photos', upload.array('photos'), (req, res, next) => {
  console.log(req.files)
  res.end('上傳多張照片成功~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.0、中間件應用-formdata解析

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')
const multer = require('multer')

// 創(chuàng)建app對象
const app = express()

// express內(nèi)置的插件
app.use(express.json())
app.use(express.urlencoded({ extended: true }))

// 編寫中間件
const formdata = multer()

app.post('/login', formdata.any(), (req, res, next) => {
  console.log(req.body)
  res.end('登錄成功, 歡迎回來~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.1、客戶端參數(shù)解析

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')

// 創(chuàng)建app對象
const app = express()


// 編寫中間件
// 1.解析queryString
app.get('/home/list', (req, res, next) => {
  // offset/size
  const queryInfo = req.query
  console.log(queryInfo)

  res.end('data list數(shù)據(jù)')
})

// 2.解析params參數(shù)
app.get('/users/:id', (req, res, next) => {
  const id = req.params.id

  res.end(`獲取到${id}的數(shù)據(jù)~`)
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.2、服務(wù)器響應數(shù)據(jù)類型

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

const express = require('express')

// 創(chuàng)建app對象
const app = express()


// 編寫中間件
app.post('/login', (req, res, next) => {
  // 1.res.end方法(比較少)
  // res.end('登錄成功, 歡迎回來~')

  // 2.res.json方法(最多)
  // res.json({
  //   code: 200,
  //   message: '歡迎回來~',
  //   list: [
  //     { name: 'iPhone', price: 111 },
  //     { name: 'iPad', price: 111 },
  //     { name: 'iMac', price: 111 },
  //     { name: 'Mac', price: 111 },
  //   ]
  // })

  // 3.res.status方法: 設(shè)置http狀態(tài)碼
  res.status(201)
  res.json('創(chuàng)建用戶成功~')
})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.3、Express的路由

Node.js之express框架學習心得,nodejs,node.js,express,nginx,運維,開發(fā)語言

router/userRouter.js文章來源地址http://www.zghlxwxcb.cn/news/detail-627020.html


const express = require('express')

// 1.創(chuàng)建路由對象
const userRouter = express.Router()

// 2.定義路由對象中的映射接口
userRouter.get('/', (req, res, next) => {
  res.json('用戶列表數(shù)據(jù)')
})
userRouter.get('/:id', (req, res, next) => {
  const id = req.params.id
  res.json('某一個用戶的數(shù)據(jù):' + id)
})
userRouter.post('/', (req, res, next) => {
  res.json('創(chuàng)建用戶成功')
})
userRouter.delete('/:id', (req, res, next) => {
  const id = req.params.id
  res.json('刪除某一個用戶的數(shù)據(jù):' + id)
})
userRouter.patch('/:id', (req, res, next) => {
  const id = req.params.id
  res.json('修改某一個用戶的數(shù)據(jù):' + id)
})

// 3.將路由導出
module.exports = userRouter

const express = require('express')
const userRouter = require('./router/userRouter')

// 創(chuàng)建app對象
const app = express()


// 編寫中間件
app.post('/login', (req, res, next) => {

})

app.get('/home', (req, res, next) => {

})

/** 用戶的接口 */
// 1.將用戶的接口直接定義在app中
// app.get('/users', (req, res, next) => {})
// app.get('/users/:id', (req, res, next) => {})
// app.post('/users', (req, res, next) => {})
// app.delete('/users/:id', (req, res, next) => {})
// app.patch('/users/:id', (req, res, next) => {})

// 2.將用戶的接口定義在單獨的路由對象中
// const userRouter = express.Router()
// userRouter.get('/', (req, res, next) => {
//   res.json('用戶列表數(shù)據(jù)')
// })
// userRouter.get('/:id', (req, res, next) => {
//   const id = req.params.id
//   res.json('某一個用戶的數(shù)據(jù):' + id)
// })
// userRouter.post('/', (req, res, next) => {
//   res.json('創(chuàng)建用戶成功')
// })
// userRouter.delete('/:id', (req, res, next) => {
//   const id = req.params.id
//   res.json('刪除某一個用戶的數(shù)據(jù):' + id)
// })
// userRouter.patch('/:id', (req, res, next) => {
//   const id = req.params.id
//   res.json('修改某一個用戶的數(shù)據(jù):' + id)
// })

// 讓路由生效
app.use('/users', userRouter)

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.4、express的靜態(tài)資源服務(wù)器

const express = require('express')

// 創(chuàng)建app對象
const app = express()

// 內(nèi)置的中間件: 直接將一個文件夾作為靜態(tài)資源
app.use(express.static('./uploads'))
app.use(express.static('./build'))

// 編寫中間件
app.post('/login', (req, res, next) => {

})

// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

5.5、express中錯誤處理的方案

const express = require('express')

// 創(chuàng)建app對象
const app = express()

app.use(express.json())

// 編寫中間件
app.post('/login', (req, res, next) => {
  // 1.獲取登錄傳入的用戶名和密碼
  const { username, password } = req.body

  // 2.對用戶名和密碼進行判斷
  if (!username || !password) {
    next(-1001)
  } else if (username !== 'coderwhy' || password !== '123456') {
    next(-1002)
  } else {
    res.json({
      code: 0,
      message: '登錄成功, 歡迎回來~',
      token: '323dfafadfa3222'
    })
  }
})


// 錯誤處理的中間件
app.use((errCode, req, res, next) => {
  const code = errCode
  let message = '未知的錯誤信息'

  switch(code) {
    case -1001:
      message = '沒有輸入用戶名和密碼'
      break
    case -1002:
      message = '輸入用戶名或密碼錯誤'
      break
  }

  res.json({ code, message })
})


// 啟動服務(wù)器
app.listen(9000, () => {
  console.log('express服務(wù)器啟動成功~')
})

到了這里,關(guān)于Node.js之express框架學習心得的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Node.js、Express框架之獲取客戶端IP地址,并獲取IP對應的城市名「簡單好用,收藏不虧」

    在進入正題之前,我們先來了解一下IP地址對我們開發(fā)者來說都有哪些重要的作用: IP地址是我們用來記錄用戶訪問日志的一個重要標識。 一方面,我們可以用來防止某一個IP地址帶來的大量DDOS攻擊,通過判斷IP地址來阻止此IP繼續(xù)訪問攻擊; 另外一個用途是用來定位,通過

    2024年02月17日
    瀏覽(37)
  • Node服務(wù)器-express框架

    Node服務(wù)器-express框架

    1 Express認識初體驗 2 Express中間件使用 3 Express請求和響應 4 Express路由的使用 5 Express的錯誤處理 6 Express的源碼解析 1、在項目文件的根目錄創(chuàng)建package.json文件 2、下載express 3、基本使用 4、運行服務(wù)器 先要下載nodemon 中間件在express就是post或者get里面的回調(diào)函數(shù)(req,res,next)

    2024年02月01日
    瀏覽(21)
  • node中間件-express框架

    node中間件-express框架

    方式一 : express提供的腳手架,直接創(chuàng)建一個應用的骨架 安裝腳手架npm install -g express-generator 創(chuàng)建項目 express express-demo 安裝依賴npm install 啟動項目 node bin/www 方式二 : 從零搭建自己的express應用結(jié)構(gòu); 初始化項目 npm init 安裝express npm i express 導入–創(chuàng)建–監(jiān)聽 使用參考文檔 中

    2024年02月16日
    瀏覽(34)
  • node.js中Express簡介

    node.js中Express簡介

    1.什么是Express 官方給出的概念:Express是基于Node.js平臺,快速、開放、極簡的web開發(fā)框架。 通俗理解:Express的作用和Node.js內(nèi)置的http模塊類似,是 專門用來創(chuàng)建web服務(wù)器的 Express的本質(zhì):就是一個npm上的第三方包,提供了快速創(chuàng)建Web服務(wù)器的便捷方法 2.進一步理解Express htt

    2024年02月08日
    瀏覽(28)
  • node.js(express.js)+mysql實現(xiàn)登錄功能

    node.js(express.js)+mysql實現(xiàn)登錄功能

    實現(xiàn)步驟 1.檢測表單數(shù)據(jù)是否合法 2.根據(jù)用戶名查詢用戶的數(shù)據(jù) 3.判斷用戶輸入的密碼是否正確 4.生成JWT 的 Token 字符串 登錄接口完整代碼如下:controllers/user.js文件 一、檢測登錄表單的數(shù)據(jù)是否合法 1)安裝 jOi 包,為表單中攜帶的每個數(shù)據(jù)項,定義驗證規(guī)則: (2)安裝 @e

    2024年01月19日
    瀏覽(28)
  • node.js(express.js)+mysql實現(xiàn)注冊功能

    node.js(express.js)+mysql實現(xiàn)注冊功能

    /utils/db.js文件的代碼如下: 項目安裝指定版本bcryptjs庫 再插入新用戶時輸入中文username mysql會 出現(xiàn)字符集不匹配的情況 報錯情況如下: ER_CANT_AGGREGATE_2COLLATIONS: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘=’ 原因: mysql數(shù)據(jù)庫建表的時候采

    2024年01月18日
    瀏覽(30)
  • Node.js: express + MySQL實現(xiàn)修改密碼

    Node.js: express + MySQL實現(xiàn)修改密碼

    ? ? ? ? 實現(xiàn)修改密碼,本篇文章實現(xiàn)修改密碼只考慮以下幾個方面: ? ? ? ? (1),獲取舊密碼 ? ? ? ? (2),獲取新密碼 ? ? ? ? (3),將獲取到的舊密碼與數(shù)據(jù)庫中的密碼進行比對(避免修改錯用戶) ? ? ? ? (4),新密碼與進密碼進行比對,新密碼和舊密碼不

    2024年02月16日
    瀏覽(20)
  • node.js項目express的初始化

    node.js項目express的初始化

    ?? 點贊,你的認可是我創(chuàng)作的動力! ?? 收藏,你的青睞是我努力的方向! ?? 評論,你的意見是我進步的財富! 在D盤新建一個文件夾,文件夾命名為api 將文件夾拖拽到vscode上面進行打開 新建一個終端 輸入 npm init -y,初始化包管理工具 輸入npm i express,安裝express框架

    2024年01月18日
    瀏覽(26)
  • 【Nodejs】Node.js簡介

    【Nodejs】Node.js簡介

    Node 的重要性已經(jīng)不言而喻,很多互聯(lián)網(wǎng)公司都已經(jīng)有大量的高性能系統(tǒng)運行在 Node 之上。Node 憑借其單線程、異步等舉措實現(xiàn)了極高的性能基準。此外,目前最為流行的 Web 開發(fā)模式是前后端分離的形式,即前端開發(fā)者與后端開發(fā)者在自己喜歡的 IDE 上獨立進行開發(fā),然后通

    2024年02月12日
    瀏覽(32)
  • node.js(express.js)+mysql實現(xiàn)新增文章分類功能

    node.js(express.js)+mysql實現(xiàn)新增文章分類功能

    表單驗證 定義路由 實現(xiàn)新增文章分類的功能的函數(shù) 結(jié)果

    2024年01月23日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包