最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js接口復(fù)習(xí)及使用案例解析

 更新時(shí)間:2023年07月24日 10:00:39   作者:Heymar  
這篇文章主要為大家介紹了node.js接口的復(fù)習(xí)及使用案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

其實(shí)復(fù)習(xí)一次的作用真實(shí)太大了,真的,自從上次ajax開始其實(shí)就開始i有點(diǎn)懵懵懂懂的感覺(jué),一直拖想到了node在去回顧一遍,這一次回去復(fù)習(xí),ajax已經(jīng)很熟練了,node之前搞不懂那些原理也順清楚了好多,其實(shí)這次復(fù)習(xí)沒(méi)有什么需要說(shuō)的知識(shí)點(diǎn),因?yàn)橐f(shuō)的前面都說(shuō)過(guò)了,我來(lái)說(shuō)一下這個(gè)做的一個(gè)大項(xiàng)目吧,這個(gè)項(xiàng)目真的,應(yīng)該是我不熟練的愿意那邊,就是用express寫接口,用postman來(lái)測(cè)試,三個(gè)模塊,三個(gè)數(shù)據(jù)庫(kù),基本上都在我的代碼里面了,寫的很詳細(xì)步驟,用到的技術(shù),基本上是用node的express模塊,去寫接口,然后中途中到了一些中間件,比如規(guī)定語(yǔ)義規(guī)則的joi,比如給密碼解碼加密的bcryptjs,我做了一天才做下來(lái)這一個(gè)案例

一個(gè)項(xiàng)目初試化,首先要?jiǎng)?chuàng)立一個(gè)單獨(dú)的項(xiàng)目文件夾,然后終端npm init直接安裝package.json,api.js接口文件,路由模塊創(chuàng)立一個(gè)文件夾夾,路由函數(shù)又要分為一個(gè)模塊,再把數(shù)據(jù)庫(kù)創(chuàng)立好,基本就可以開始完成功能需求了,用后端node完成增刪改查

項(xiàng)目文件分類:

接口文件

// 1.初始化
// 1.1創(chuàng)建項(xiàng)目
const express = require('express')
const app = express()
// 1.2配置跨域
const cors = require('cors')
app.use(cors())
// 1.3配置解析表單中間件
// 錯(cuò)誤點(diǎn):記住要有參數(shù)
app.use(express.urlencoded({extended : false}))
// 2.3因?yàn)楹竺嫣幚砗瘮?shù)用到了很多res.send所以封裝為一個(gè)全局中間件,給res綁定一個(gè)函數(shù),那后面的中間件路由都可以用到這個(gè)函數(shù)了
app.use((req, res, next) => {
    res.cc = function(err, status = 1) {
        res.send({
            status,
            msg : err instanceof Error ? err.message : err
        })
    }
    next()
})
// 2.4.6配置解析token的中間件
const expressJWT = require('express-jwt')
const secretKey = require('./secretKey')
app.use(expressJWT({secret : secretKey.secretKey, algorithms : ['HS256']}).unless({path : [/^\/api\//]}))
// 1.4.4導(dǎo)入路由模塊
const routerUser = require('./router/user')
const Joi = require('joi')
const { expressjwt } = require('express-jwt')
const { path } = require('express/lib/application')
app.use('/api', routerUser)
// 3.1.1個(gè)人中心路由導(dǎo)入
const infoRouter = require('./router/userinfo')
app.use('/my', infoRouter)
// 4.1.2文章管理導(dǎo)入
const article = require('./router/acticle')
app.use('/my/article', article)
// 5.1.2發(fā)布文章路由導(dǎo)入
const cates = require('./router/cate')
app.use('/my/article', cates)
// 2.2.3定義規(guī)則joi的錯(cuò)誤級(jí)別中間件
app.use((err, req, res, next) => {
    if (err instanceof Joi.ValidationError) return res.send(err.message)
    // 2.4.7增加jwt錯(cuò)誤中間件
    if (err.name == 'UnauthorizedError') return res.cc('身份認(rèn)證失敗')
    return res.send('其他錯(cuò)誤')
})
app.listen(80, () => {
    console.log('http://127.0.0.1');
})

路由創(chuàng)建模塊

寫好接口文件該去給路由創(chuàng)建模塊

// 1.4初始化路由相關(guān)文件夾 不光要給路由分裝一個(gè)模塊 里面的處理函數(shù)也要有一個(gè)模塊
const express = require('express')
const { append } = require('express/lib/response')
const router = express.Router()
// 1.4.2導(dǎo)入路由處理函數(shù)
const routerHandler = require('../router_handler/user')
// 注冊(cè)
// 2.2.2導(dǎo)入joi驗(yàn)證輸入進(jìn)來(lái)的是否合法
const expressJOI = require('@escook/express-joi')
const {schema_user_info} = require('../schema/user')
router.post('/reguser',expressJOI(schema_user_info), routerHandler.getReguser)
// 2.4登錄
// 2.4.1添加語(yǔ)法規(guī)則,可以直接用注冊(cè)的
router.post('/login',expressJOI(schema_user_info), routerHandler.getLogin)
module.exports = router

處理函數(shù)模塊

// 1.4.1初始化路由處理函數(shù)模塊
//注冊(cè)
const db = require('../mysql')
//導(dǎo)入密碼加密解密包
const bcrypt = require('bcryptjs')
function getReguser(req, res) {
    // res.send('這里是注冊(cè)模塊')
    // 2.2.4檢測(cè)用戶名是否被占用 導(dǎo)入mysql
    let selectUser = 'select * from users where username = ?'
    db.query(selectUser, req.body.username, (err, results) => {
        // 2.3.1用到我們前面定義的全局中間件優(yōu)化res.send
        if (err) return res.cc(err)
        if (results.length == 1) return res.cc('用戶名已被占用')
        // 2.2.5如果過(guò)了前兩關(guān)的驗(yàn)證 基本可以驗(yàn)證成功了 就先對(duì)密碼進(jìn)行加密處理安裝bcryptjs
        req.body.password = bcrypt.hashSync(req.body.password, 10)
        // console.log(req.body.password);
        // 2.2.6插入新用戶
        let insertUser = 'insert into users set ?'
        // -------------注意一下這里插入數(shù)據(jù)庫(kù)的參數(shù)怎么寫的
        db.query(insertUser, [{username : req.body.username, password : req.body.password}], (err, results) => {
            if (err) return res.cc(err)
            if (results.affectedRows !== 1) return res.cc('注冊(cè)失敗')
            res.cc('注冊(cè)成功',0)
        })
    })
}
//登錄
// 2.4.4.1導(dǎo)入jwt
const jwt = require('jsonwebtoken')
const secretKey = require('../secretKey')
const { result } = require('@hapi/joi/lib/base')
function getLogin(req, res) {
    // res.send('這里是登錄模塊')
    // 2.4.2根據(jù)用戶名查詢用戶的數(shù)據(jù)
    let selectLoginuser = 'select * from users where username = ?'
    db.query(selectLoginuser, req.body.username, (err, results) => {
        if (err) res.cc(err)
        if (results.length !== 1) res.cc('未找到該用戶')
        // 2.4.3有數(shù)據(jù)就去判斷密碼是否正確
        // console.log(results);
        if (!bcrypt.compareSync(req.body.password, results[0].password)) return res.cc('密碼錯(cuò)誤')
        // 2.4.4用戶名有,密碼 也對(duì)上了說(shuō)明登陸成功,開始jwt身份認(rèn)證
        // 先剔除密碼和頭像的值
        let user = {...results[0], password : '', user_pic: '',algorithms : ['HS256']}
        let userToken = jwt.sign(user, secretKey.secretKey, {expiresIn : '1h'})
        // 2.4.5向客戶端發(fā)送token
        res.send({
            status : 0, 
            msg : '登錄成功',
            token : 'Bearer ' + userToken
        })
    })
}
// 獲取用戶基本信息
function getInfo(req,res) {
    // res.send('個(gè)人中心')
    // 3.1.2獲取用戶基本信息
    let selectInfo = 'select id,username,nickname,email,user_pic from users where id = ?'
    db.query(selectInfo, req.user.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.length !== 1) return res.cc('獲取信息失敗')
        res.send({
            status : 0,
            msg : '獲取信息成功',
            data : results[0]
        })
    })
}
// 3.2更新用戶信息
function updateInfo(req, res) {
    // res.send('更新用戶信息')
    // 3.2.4更新用戶功能
    let updateInfo = 'update users set ? where id = ?'
    db.query(updateInfo, [req.body, req.user.id], (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('更新信息失敗')
        res.cc('更新信息成功', 0)
    })
}
// 3.3重置密碼
function updatePwd(req, res) {
    // res.send('重置密碼')
    // 3.3.2查詢用戶是否存在
    let selectExist = 'select * from users where id = ?'
    db.query(selectExist, req.user.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.length !== 1) return res.cc('用戶不存在')
        // 3.3.3前面那一步雖然無(wú)所謂但這一步必須的 判斷輸入的舊密碼是否正確
        if(!bcrypt.compareSync(req.body.oldPwd, results[0].password)) return res.cc('輸入密碼錯(cuò)誤')
        // 3.3.4對(duì)新密碼加密后更新到數(shù)據(jù)庫(kù)
        let password = bcrypt.hashSync(req.body.newPwd)
        let updatePwd = 'update users set password =? where id =?'
        db.query(updatePwd, [password,req.user.id], (err, results) => {
            if (err) return res.cc(err)
            if (results.affectedRows !== 1) return res.cc('修改密碼失敗')
            res.cc('更新密碼成功', 0)
        })
    })
}
// 3.4更換頭像
function updateAvatar(req, res) {
    // res.send('更換頭像')
    // 3.4.3
    let updateAvatar = 'update users set user_pic = ? where id = ?'
    db.query(updateAvatar, [req.body.avatar, req.user.id], (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('更新頭像失敗')
        res.cc('更新頭像成功', 0)
    })
}
module.exports = {
    getLogin,
    getReguser,
    getInfo,
    updateInfo,
    updatePwd,
    updateAvatar
}

api入口文件測(cè)試

這個(gè)時(shí)候就可以去api入口文件測(cè)試一下了,然后在數(shù)據(jù)庫(kù)寫好我們的數(shù)據(jù)表,創(chuàng)立一個(gè)js文件鏈接數(shù)據(jù)庫(kù)

// 2.登錄注冊(cè)
// 2.1建好數(shù)據(jù)庫(kù)后配置數(shù)據(jù)庫(kù)
const { result } = require('@hapi/joi/lib/base')
const mysql = require('mysql')
const db = mysql.createPool({
    host : '127.0.0.1',
    user : 'root',
    password : 'admin123',
    database : 'mydb'
})
// 測(cè)試
/* db.query('select 1' , (err, results) => {
    if(err) return console.log(err.message);
    return console.log(results);
}) */
module.exports = db

jwt認(rèn)證機(jī)制生成token

沒(méi)記錯(cuò)的話,在登錄接口應(yīng)該使用jwt認(rèn)證機(jī)制生成token吧

const express = require('express')
const router = express.Router()
const routerHandler = require('../router_handler/user')
// 3.個(gè)人中心
// 3.1獲取用戶基本信息
router.get('/userinfo', routerHandler.getInfo)
// 3.2.1更新用戶信息
// 3.2.3添加驗(yàn)證規(guī)則
const expressJoi = require('@escook/express-joi')
const {schema_update_info, schema_update_avatar} = require('../schema/user')
router.post('/userinfo',expressJoi(schema_update_info),routerHandler.updateInfo)
// 3.3.1重置密碼
const {schema_update_pwd} = require('../schema/user')
router.post('/updatepwd',expressJoi(schema_update_pwd), routerHandler.updatePwd)
// 3.4.1更換頭像
const {schema_updatee_avatar} = require('../schema/user')
router.post('/update/avatar',expressJoi(schema_updatee_avatar), routerHandler.updateAvatar)
module.exports = router

token的驗(yàn)證規(guī)則

module.exports = {
    secretKey : 'sdfafsfds'
}

user的驗(yàn)證規(guī)則

上面就是整個(gè)user部分的接口了包括登錄注冊(cè),添加刪除修改賬號(hào)或者密碼等,下面是我們的user的驗(yàn)證規(guī)則

// 2.2注冊(cè)
// 2.2.1對(duì)表單數(shù)據(jù)驗(yàn)證,這里就不if else了直接用上joi來(lái)驗(yàn)證 joi要下最新版而且直接導(dǎo)入joi
const { number } = require('joi')
const joi = require('joi')
const username = joi.string().alphanum().min(1).max(10).required()
// 錯(cuò)誤點(diǎn):正則{}里面的量詞之間不能以空格隔開
const password = joi.string().pattern(/^[\S]{6,12}$/).required()
// 3.2.2更新用戶信息規(guī)則
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
// 3.4.2更換頭像規(guī)則
const avatar = joi.string().dataUri().required()
module.exports.schema_user_info = {
    body : {
        username,
        password
    }
}
module.exports.schema_update_info = {
    body : {
        id,
        nickname,
        email
    }
}
module.exports.schema_update_pwd = {
    // 3.3.2重置密碼規(guī)則
    body : {
        oldPwd : password,
        // --------------錯(cuò)誤點(diǎn)這里就算是變量也要添加引號(hào)
        newPwd : joi.not(joi.ref('oldPwd')).concat(password)
    }
}
module.exports.schema_updatee_avatar = {
    body : {
        avatar
    }
}

判斷是否重名

這個(gè)部分是對(duì)文章的名字和別名的增刪改查的操作了,這里面的難點(diǎn)在于要去理解那個(gè)怎么來(lái)判斷是否重名哪里

// 4.1.1文章分類列表函數(shù)
const { result } = require('@hapi/joi/lib/base')
const db = require('../mysql')
function getArticleList(req, res) {
    // res.send('文章分類列表')
    // 4.1.3獲取文章數(shù)據(jù)
    let selectArticleList = 'select * from article where is_delete = 0'
    db.query(selectArticleList, (err, results) => {
        if (err) return res.cc(err)
        res.send({
            status : 0,
            msg : '獲取文章分類列表成功',
            data : results
        })
    })
}
// 4.2.1新增文章分類
function addCates(req,res) {
    // 4.2.3名字與別名是否重名
    let selectDuplicate = 'select * from article where name = ? or alias = ?'
    db.query(selectDuplicate, [req.body.name, req.body.alias], (err, results) => {
        if(err) return res.cc(err)
        if(results.length == 2) return res.cc('文章名字和別名已被占用')
        if(results.length == 1 && results[0].name == req.body.name && results[0].alias == req.body.alias) return res.cc('文章名字和別名已被占用')
        if(results.length == 1 && results[0].name == req.body.name) return res.cc('文章名字被占用')
        if(results.length == 1 && results[0].alias == req.body.alias) return res.cc('文章別名被占用')
        // 4.2.4實(shí)現(xiàn)文章分類新增
        let addArt = 'insert into article set ?'
        db.query(addArt, req.body, (err, results) => {
            if(err) return res.cc(err)
            if (results.affectedRows !== 1) return res.cc('新增文章失敗')
            res.cc('新增文章分類成功', 0)
        })
    })
}
// 4.3.1根據(jù)idshanchuwenzhan
function deleteCate(req, res) {
    // 4.3.3實(shí)現(xiàn)刪除功能
    let deleteId = 'update article set is_delete = 1 where id = ?'
    db.query(deleteId, req.params.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('刪除文章失敗')
        res.cc('刪除文章分類成功', 0)
    })
}
// 4.4.1根據(jù)id獲取文章分類
function requireArt(req,res) {
    // 4.4.2
    let selectArt = 'select * from article where id = ?'
    db.query(selectArt, req.params.id, (err, results) => {
        if (err) return res.cc(err)
        if (results.length !== 1 || results[0].is_delete == 1) return res.cc('沒(méi)有該文章')
        res.send({
            status : 0,
            msg : '獲取文章分類數(shù)據(jù)成功',
            data : results[0]
        })
    })
}
// 4.5.1根據(jù)id更新文章
function updateArt(req, res) {
    // 4.5.2查看是否重名
    // -----------------這里需要先將自己這一項(xiàng)排除出來(lái)
    let selectIdDuplicate = 'select * from article where id != ? and (name = ? or alias = ?)'
    db.query(selectIdDuplicate, [req.body.id, req.body.name, req.body.alias], (err, results) => {
        if (err) return res.cc(err)
        if (results.length == 2) return res.cc('文章名稱和別名已被占用')
        if (results.length == 1 && results[0].name == req.body.name && results[0].alias == req.body.alias) return res.cc('文章名稱和別名已被占用')
        if (results.length == 1 && results[0].name == req.body.name) return res.cc('文章名稱已被占用')
        if (results.length == 1 && results[0].alias == req.body.alias) return res.cc('別名已被占用')
        let updateIdArt = 'update article set ? where id = ?'
        db.query(updateIdArt, [req.body, req.body.id] , (err,results) => {
            if (err) return res.cc(err)
            if (results.affectedRows !== 1) return res.cc('文章更新失敗')
            res.cc('更新分類信息成功', 0)
        })
    })
}
module.exports = {
    getArticleList,
    addCates,
    deleteCate,
    requireArt,
    updateArt
}

處理函數(shù)

這是路由模塊,上面是路由的處理函數(shù)

// 4.文章類別管理
const express = require('express')
const router = express.Router()
const routerhanlder = require('../router_handler/article')
// 4.1獲取文章分類列表
router.get('/cates',routerhanlder.getArticleList)
// 4.2新增文章分類
const expressJoi = require('@escook/express-joi')
const {add_article_list, update_id_cate} =require('../schema/article')
router.post('/addcates',expressJoi(add_article_list),routerhanlder.addCates)
// 4.3根據(jù)id刪除文章
const {delete_id_cate} = require('../schema/article')
router.get('/deletecate/:id',expressJoi(delete_id_cate),routerhanlder.deleteCate)
// 4.4根據(jù)id獲取文章分類數(shù)據(jù)
router.get('/cates/:id',expressJoi(delete_id_cate), routerhanlder.requireArt)
// 4.5根據(jù)id更新文章分類數(shù)據(jù)
const {update_id_Art} = require('../schema/article')
router.post('/updatecate',expressJoi(update_id_Art) ,routerhanlder.updateArt)
module.exports = router

然后我們的規(guī)則

const joi = require('joi')
// 4.2.2新增文章規(guī)則
const name = joi.string().required()
const alias = joi.string().alphanum().required()
// 4.3.2根據(jù)id刪除文章 注意這個(gè)id是動(dòng)態(tài)的而且是get請(qǐng)求,所以不再是body數(shù)據(jù)
const id = joi.number().integer().min(1).required()
module.exports.add_article_list = {
    body : {
        name,
        alias
    }
}
module.exports.delete_id_cate = {
    params : {
        id
    }
}
module.exports.update_id_Art = {
    body : {
        id : id,
        name : name,
        alias : alias
    }
}

添加文章功能

最后是我們的添加文章這個(gè)功能,就是往每一個(gè)剛才創(chuàng)建好的文章里面,添加新文章,直接看邏輯的實(shí)現(xiàn)吧

// 5.1.1發(fā)布文章函數(shù)
const path = require('path')
const db = require('../mysql')
function addCate(req, res) {
    // 5.1.5因?yàn)樯蟼鞅韱螣o(wú)法用joi所以要單獨(dú)規(guī)定
    if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('請(qǐng)上傳圖片')
    // 5.1.6事先發(fā)布文章功能
    const cateObj = {
        ...req.body,
        cover_img : path.join('/uploads', req.file.filename),
        pub_date : new Date(),
        author_id : req.user.id
    }
    let addInsert = 'insert into articles set ?'
    db.query(addInsert,  cateObj, (err, results) => {
        if (err) return res.cc(err)
        if (results.affectedRows !== 1) return res.cc('發(fā)布文章失敗')
        res.cc('發(fā)布文章成功', 0)
    })
}
module.exports = {
    addCate
}
// 1.4初始化路由相關(guān)文件夾 不光要給路由分裝一個(gè)模塊 里面的處理函數(shù)也要有一個(gè)模塊
const express = require('express')
const { append } = require('express/lib/response')
const router = express.Router()
// 1.4.2導(dǎo)入路由處理函數(shù)
const routerHandler = require('../router_handler/user')
// 注冊(cè)
// 2.2.2導(dǎo)入joi驗(yàn)證輸入進(jìn)來(lái)的是否合法
const expressJOI = require('@escook/express-joi')
const {schema_user_info} = require('../schema/user')
router.post('/reguser',expressJOI(schema_user_info), routerHandler.getReguser)
// 2.4登錄
// 2.4.1添加語(yǔ)法規(guī)則,可以直接用注冊(cè)的
router.post('/login',expressJOI(schema_user_info), routerHandler.getLogin)
module.exports = router

以上就是node.js接口復(fù)習(xí)及使用案例解析的詳細(xì)內(nèi)容,更多關(guān)于node.js接口使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Linux通過(guò)yum命令徹底刪除node.js并重新安裝

    Linux通過(guò)yum命令徹底刪除node.js并重新安裝

    這篇文章主要介紹了Linux通過(guò)yum命令徹底刪除node.js并重新安裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • Node.js服務(wù)端實(shí)戰(zhàn)之服務(wù)啟動(dòng)過(guò)程詳解

    Node.js服務(wù)端實(shí)戰(zhàn)之服務(wù)啟動(dòng)過(guò)程詳解

    這篇文章主要為大家介紹了Node.js服務(wù)端實(shí)戰(zhàn)之服務(wù)啟動(dòng)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • node.js中使用q.js實(shí)現(xiàn)api的promise化

    node.js中使用q.js實(shí)現(xiàn)api的promise化

    這篇文章主要介紹了node.js中使用q.js實(shí)現(xiàn)api的promise化,promise一個(gè)標(biāo)準(zhǔn),它描述了異步調(diào)用的返回結(jié)果,包括正確返回結(jié)果和錯(cuò)誤處理,需要的朋友可以參考下
    2014-09-09
  • Node.js基礎(chǔ)入門之path模塊,url模塊,http模塊使用詳解

    Node.js基礎(chǔ)入門之path模塊,url模塊,http模塊使用詳解

    這篇文章主要為大家介紹了Node.js中的三個(gè)模塊(path、url、http)的使用詳解,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-03-03
  • Node.js 異步任務(wù)協(xié)作方案:7 種實(shí)用方案與真實(shí)項(xiàng)目案例

    Node.js 異步任務(wù)協(xié)作方案:7 種實(shí)用方案與真實(shí)項(xiàng)目案例

    文章介紹了7種Node.js中處理多個(gè)獨(dú)立異步任務(wù)的方案,包括Promise.all、Promise.allSettled、Promise.race、Promise.any、事件計(jì)數(shù)器、流式處理和隊(duì)列控制,每種方案都適用于特定場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • Node.js的環(huán)境安裝配置(使用nvm方式)

    Node.js的環(huán)境安裝配置(使用nvm方式)

    在我們前端開發(fā)工程中,很多繁瑣機(jī)械的操作都是會(huì)慢慢的被抽離出來(lái)的,比如當(dāng)我們?yōu)閐om操作和瀏覽器兼容性感到厭煩時(shí),jQuery出現(xiàn)了,隨著時(shí)間的發(fā)展,JavaScript現(xiàn)在被應(yīng)用到了服務(wù)器中,但是首先第一步我們要學(xué)會(huì)如何安裝配置Node.js的環(huán)境,本文是使用nvm方式,來(lái)一起看看。
    2016-10-10
  • 淺談express.js框架中間件(middleware)

    淺談express.js框架中間件(middleware)

    這篇文章主要介紹了淺談express.js框架中間件(middleware),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • NodeJS 實(shí)現(xiàn)手機(jī)短信驗(yàn)證模塊阿里大于功能

    NodeJS 實(shí)現(xiàn)手機(jī)短信驗(yàn)證模塊阿里大于功能

    這篇文章主要介紹了NodeJS 實(shí)現(xiàn)手機(jī)短信驗(yàn)證模塊阿里大于功能,需要的朋友可以參考下
    2017-06-06
  • node.js中Buffer緩沖器的原理與使用方法分析

    node.js中Buffer緩沖器的原理與使用方法分析

    這篇文章主要介紹了node.js中Buffer緩沖器的原理與使用方法,結(jié)合實(shí)例形式分析了node.js Buffer緩沖器的基本概念、原理、創(chuàng)建、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • node.js中的http.get方法使用說(shuō)明

    node.js中的http.get方法使用說(shuō)明

    這篇文章主要介紹了node.js中的http.get方法使用說(shuō)明,本文介紹了http.get的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

崇礼县| 乳山市| 安化县| 通州区| 庆安县| 昌图县| 依安县| 海伦市| 南皮县| 顺义区| 微博| 搜索| 昭苏县| 汽车| 富源县| 汽车| 镇雄县| 丹寨县| 榆林市| 焦作市| 奈曼旗| 广汉市| 句容市| 明星| 茂名市| 阿荣旗| 广安市| 勃利县| 河北省| 泌阳县| 北京市| 武城县| 庄浪县| 禹州市| 皋兰县| 新密市| 会泽县| 阿拉善盟| 客服| 闵行区| 苍梧县|