node:http协议、sql、接口
文章目錄
- node:http協(xié)議、sql、接口
- 網(wǎng)絡(luò)通信
- 進一步了解HTTP請求
- sql
- 用戶接口
- 分頁接口(模糊)
- 表關(guān)聯(lián)
- 分頁例子:
node:http協(xié)議、sql、接口
萬維網(wǎng)是由一系列相互連接的文檔組成的。其中許多文檔是超文本標(biāo)記語言(HTML)文檔。web瀏覽器從服務(wù)器請求這些文檔,并將內(nèi)容呈現(xiàn)出來。呈現(xiàn)的內(nèi)容依賴于一組Cascanding樣式表(CSS)規(guī)則,這些規(guī)則通常在單獨的CSS文件中提供,如果沒有提供樣式文件,那么將使用瀏覽器的默認(rèn)值。HTML文檔包含網(wǎng)頁的內(nèi)容,CSS文件包含有關(guān)如何將網(wǎng)頁呈現(xiàn)給用戶的信息。
網(wǎng)絡(luò)通信
??與互聯(lián)網(wǎng)的通信是通過你的計算機上的網(wǎng)絡(luò)連接實現(xiàn)的,每次你的計算機與互聯(lián)網(wǎng)上的另一臺計算機通信時,連接就會被建立。這里主要有兩種類型的連接,傳輸控制協(xié)議(TCP)連接和用戶數(shù)據(jù)報協(xié)議(UDP)連接。在大多數(shù)情況下,當(dāng)為瀏覽器請求網(wǎng)頁時,會使用TCP連接。TCP沒有指定如何檢索網(wǎng)頁,TCP是一個低層次的協(xié)議,它只關(guān)心確保數(shù)據(jù)傳輸,而這是留給超文本傳輸協(xié)議(HTTP)的。HTTP提供了一組關(guān)于客戶端應(yīng)該如何從服務(wù)器請求網(wǎng)頁的規(guī)則,并規(guī)定了服務(wù)器應(yīng)該如何響應(yīng)。
進一步了解HTTP請求
??所有的HTTP請求都是在客戶端和服務(wù)器這兩方之間進行的。客戶機是發(fā)起對話的計算機,服務(wù)器是處理請求的計算機(在對話中可能有中間代理)。根據(jù)定義,每個請求都由客戶機發(fā)起,并從輸入資源的名稱開始。資源的名稱作為統(tǒng)一資源定位符(URL)提供,其中包含檢索文檔所需的所有信息。單獨的URL不足以啟動連接,因為網(wǎng)絡(luò)連接需要一個互聯(lián)網(wǎng)協(xié)議(IP)地址來創(chuàng)建連接。IP地址類似于因特網(wǎng)上某臺計算機的電話號碼。要從URL獲取IP地址,在域命名服務(wù)(DNS)中查詢域名(URL中用句號標(biāo)點的部分)。域名命名服務(wù)就像互聯(lián)網(wǎng)的電話簿,允許通過給定的名稱檢索IP地址。域名是IP地址的別名,讓用戶更方便地記住他們感興趣的資源的地址。一旦找到了一個URL的IP地址,計算機就會建立一個連接,當(dāng)這個連接建立后,HTTP請求就可以開始了。HTTP是一種無狀態(tài)協(xié)議,這意味著它們在請求之間沒有內(nèi)存或狀態(tài)。
??HTTP請求是按照HTTP格式設(shè)置的字符序列。下面顯示了一個HTTP請求的示例。
GET /index.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.example.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
??該請求包含一個HTTP動詞,GET請求的資源,/index.html以及使用的協(xié)議版本,HTTP/1.1。請求的其余部分不是必需的,但是會向服務(wù)器提供附加信息。假設(shè)請求成功,服務(wù)器將響應(yīng)一個狀態(tài)代碼和請求的資源。HTTP請求的響應(yīng)示例如下所示。
HTTP/1.1 200 OK Date: Mon, 11 April 2016 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: UTF-8 Content-Length: 99 Last-Modified: Mon, 11 April 2016 00:00:00 GMT Server: Apache/2.4.20 (Unix) (Red-Hat/Linux) Accept-Ranges: bytes Connection: close<html><head><title>An Example Page</title></head><body>Hello World!!!!</body> </html>??來自服務(wù)器的響應(yīng)包含一些響應(yīng)頭信息,后面跟著請求的內(nèi)容。請求的第一行的數(shù)字,200,是請求的HTTP狀態(tài)碼。狀態(tài)碼200表示請求成功。
??在HTTP中指定了許多不同類型的HTTP請求。我們將在本課程中遇到許多請求類型。下表概述了它們的用途。
| GET方法意味著檢索由請求URI標(biāo)識的任何信息(以實體的形式)。如果請求URI指的是一個數(shù)據(jù)生成過程,則生成的數(shù)據(jù)應(yīng)該作為響應(yīng)中的實體返回,而不是進程的源文本,除非該文本恰好是進程的輸出。 | GET |
| POST方法用于請求源服務(wù)器接受包含在請求中的實體,作為請求行中由請求URI標(biāo)識的資源的新下級。POST旨在采用統(tǒng)一的方法涵蓋以下功能:1.對現(xiàn)有資源的注釋;2.將消息發(fā)布到公告欄、新聞組、郵件列表或類似的文章組;3.向數(shù)據(jù)處理過程提供數(shù)據(jù)塊,例如提交表單的結(jié)果;4.通過追加操作擴展數(shù)據(jù)庫。 | POST |
| PUT方法請求將封閉的實體存儲在提供的請求URI下。如果請求URI引用的是一個已經(jīng)存在的資源,那么封閉的實體應(yīng)該被認(rèn)為是駐留在原始服務(wù)器上的實體的修改版本。如果請求URI不指向現(xiàn)有資源,并且該URI能夠被請求用戶代理定義為新資源,則源服務(wù)器可以使用該URI創(chuàng)建資源。 | PUT |
| DELETE方法請求源服務(wù)器刪除由請求URI標(biāo)識的資源。 | DELETE |
| HEAD方法與GET相同,只是服務(wù)器不能在響應(yīng)中返回消息體。 | HEAD |
| TRACE方法用于返回遠(yuǎn)程、應(yīng)用程序?qū)拥恼埱笙?nèi)容。 | TRACE |
| OPTIONS方法表示請求,以獲取有關(guān)由請求URI標(biāo)識的請求/響應(yīng)鏈上可用的通信選項的信息。該方法允許客戶端確定與資源或服務(wù)器功能相關(guān)的選項和/或需求,而不需要進行資源操作或啟動資源檢索。 | OPTION |
| 此規(guī)范保留方法名CONNECT,以便與可以動態(tài)切換路徑的代理一起使用。 | CONNECT |
| PATCH方法請求將請求實體中描述的一組更改應(yīng)用于由請求URI標(biāo)識的資源。 | PATCH |
??HTTP狀態(tài)碼在決定請求是否成功時非常重要。下表總結(jié)了HTTP狀態(tài)代碼,完整的列表可以在Web技術(shù)學(xué)習(xí)資源介紹中找到。
| 1xx | 響應(yīng)信息 |
| 2xx | 成功響應(yīng) |
| 3xx | 重定向響應(yīng) |
| 4xx | 客戶端錯誤響應(yīng) |
| 5xx | 服務(wù)器錯誤響應(yīng) |
sql
查詢
select * from jd_user 查詢jd_user表的數(shù)據(jù)
select * from jd_user where account="admin" and password="admin@123" 有條件查詢
添加
更新(一定要加上約束條件)
update jd_user set account='aaaaaa' where id=5刪除(一定要加上約束條件)
delete from jd_user where id=5用戶接口
添加router.route('/user/create').post(userCtrl.createUser);
修改router.route('/user/update').post(userCtrl.updateUser);
刪除router.route('/user/delete/:id').post(userCtrl.deleteUser);
查詢router.route('/user/query').get(userCtrl.query);
分頁接口(模糊)
- 輸入?yún)?shù):pageNo頁碼(從第1頁開始),pageSize當(dāng)前頁條數(shù)(一頁顯示20條)
- 輸出參數(shù):list(20條) rows總條數(shù) 分頁頁碼=math.ceil(rows/pageSize)
- 模糊查詢 模糊匹配
- select * from jd_user where account like '%test%'
- 查找account字段中包括test字符串的所有數(shù)據(jù)
表關(guān)聯(lián)
- 用戶表 角色表 用戶–角色表
- 若需要查詢某個用戶有什么角色?
- 一個用戶可能有多個角色 一個角色可能被多個用戶使用
表關(guān)聯(lián)關(guān)系 left join xxx on xxx=xxxx
分頁例子:
my.route.js
//路由 import express from 'express' import userCtrl from '../controllers/user.ctrl'const router = express.Router(); //使用express框架自帶的路由 類比vue-routerexport default function(app){//控制器接口--需要路由 接口請求方式(get post)//接口定義請求方式: get post delete put//用戶 路由地址 請求方式 控制器接口router.route('/user/list-page').post(userCtrl.listPage);router.route('/user/create').post(userCtrl.createUser);router.route('/user/update').post(userCtrl.updateUser);router.route('/user/delete/:id').post(userCtrl.deleteUser);router.route('/user/query').get(userCtrl.query);router.route('/user/list').get(userCtrl.list);router.route('/user/login').post(userCtrl.login);// /api/user/login//權(quán)限//合同//把路由配置在myexpress實例上app.use('/api', router); }user.ctrl.js - 增刪改查接口
//用戶控制器 操作用戶的接口 import logger from '../util/logger' import * as userService from '../service/user.service'const operations = {//用戶查詢query: function(req, res){logger.info("用戶查詢開始")userService.findUser("admin", "admin@123").then(data=> {res.status(200).json(data)logger.info("用戶查詢結(jié)束")})},// 用戶登錄接口login: function(req, res){let {account, password} = req.body;logger.info("調(diào)用用戶登錄接口開始"+account+" "+password)userService.findUser(account, password).then(data=> {if(data){let result = {data:data,token: new Date().getTime(),msg: "用戶登錄成功"}res.status(200).json(result)logger.info("用戶登錄成功")}else{res.status(400).json({"msg":"用戶登錄失敗"})logger.info("用戶登錄失敗")}})},// 用戶查詢列表接口list: function(req, res){//req--request res-responselogger.info("調(diào)用用戶查詢接口")let users = [{name:"小張"}, {name:"小王"}]//給瀏覽器返回數(shù)據(jù)// res.status(200).send(users)res.status(200).json(users)logger.info("調(diào)用用戶查詢接口結(jié)束")},listPage: function(req, res){let {pageNo, pageSize, account} = req.body;if (pageNo && pageSize) {pageNo = pageNo - 1; //頁數(shù)是從1開始 數(shù)據(jù)庫是從0開始userService.findUserByPage(pageNo, pageSize, account).then(data=>{res.status(200).json(data)})}},// 添加用戶createUser: function(req, res) {const user = req.body;logger.info("添加用戶"+JSON.stringify(user))userService.createUser(user).then(data=>{res.status(200).json({"msg":"添加用戶成功"})logger.info("添加用戶結(jié)束")}).catch(err=>{res.status(400).json({"msg":err})logger.info("添加用戶異常")})},//修改用戶updateUser: function(req, res){const user = req.body;logger.info("修改用戶"+JSON.stringify(user))userService.updateUser(user).then(data=>{res.status(200).json({"msg":"修改用戶成功"})logger.info("修改用戶結(jié)束")}).catch(err=>{res.status(400).json({"msg":err})logger.info("修改用戶異常")})},//刪除用戶 id參數(shù)希望在url最后面 /:iddeleteUser: function(req, res){const userId = req.params.id;logger.info("刪除用戶"+userId)userService.deleteUser(userId).then(data=>{res.status(200).json({"msg":"刪除用戶成功"})logger.info("刪除用戶結(jié)束")}).catch(err=>{res.status(400).json({"msg":err})logger.info("刪除用戶異常")})} }export default operationsuser.service.js
// 用戶服務(wù)層 import logger from '../util/logger' import models from '../models' // ./models等價于./models/index const User = models.jd_user;/*登錄查詢**/ export function findUser(account, pwd) {return User.findOne({ //User模型自帶findOnewhere: {account: account, //左邊的名字對應(yīng)user模型名 右邊是參數(shù) password: pwd}}) //findOne--User模型自帶的 }/*** 用戶添加* 輸入?yún)?shù):user對象,包括用戶的基本信息,不需要id, 會自動增加* 輸出:無*/ export function createUser(user){return User.create(user); //創(chuàng)建 }/*** 用戶修改* 輸入?yún)?shù):user對象,包括用戶的基本信息, 需要id*/ export function updateUser(user){if (user && user.id) {return User.findByPk(user.id) //根據(jù)用戶id查找.then(u=>{ //u===查找到的用戶return u.update(user) //把傳入的user覆蓋到數(shù)據(jù)庫的u上面})} else {logger.error("參數(shù)錯誤:"+JSON.stringify(user))} }/*** 用戶刪除* 輸入?yún)?shù):id*/ export function deleteUser(uid){return User.destroy({ //刪除 方法在數(shù)據(jù)模型中定義where: {id:uid}}) }/*** 用戶分頁* 輸入?yún)?shù):pageNo頁碼(從第1頁開始),pageSize當(dāng)前頁條數(shù)(一頁顯示20條)輸出參數(shù):list(20條) rows總條數(shù) 分頁頁碼=math.ceil(rows/pageSize)- account 模糊匹配*/ export async function findUserByPage(pageNo, pageSize, account){let limit = pageSize; //讀多少條let offset = pageNo*pageSize; //從哪一條開始讀 數(shù)據(jù)庫里是從0開始let result = {};if (account) {//模糊匹配分頁結(jié)果var d = await models.sequelize.query(`select * from jd_user where account like ? limit ${offset},${limit}`,{replacements:['%'+account+'%'], model: User}) //用account替換?result.data = d;//模糊匹配分頁總條數(shù)var dd = await models.sequelize.query("select count(*) num from jd_user where account like ?",{replacements:['%'+account+'%']})if (dd) {// if (dd[0] && dd[0].length>0)result.rows = dd[0][0].num; //sql結(jié)果是一個二維數(shù)組result.pages = Math.ceil(result.rows/pageSize)}} else {var d = await User.findAll({ //查詢所有limit: Number(limit), //數(shù)字轉(zhuǎn)換offset: Number(offset),order: [["id", "desc"] //數(shù)據(jù)反過來排列]})result.data = d;var dd = await models.sequelize.query("select count(*) num from jd_user")if (dd) {// if (dd[0] && dd[0].length>0)result.rows = dd[0][0].num; //sql結(jié)果是一個二維數(shù)組result.pages = Math.ceil(result.rows/pageSize)}}return result; }總結(jié)
以上是生活随笔為你收集整理的node:http协议、sql、接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node:ORM、数据模型、脚本创建模型
- 下一篇: node:jwt、拦截器-学习笔记