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

Node.js到底是什么?

這篇具有很好參考價(jià)值的文章主要介紹了Node.js到底是什么?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

Node.js是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境。

JavaScript是腳本語(yǔ)言,腳本語(yǔ)言需要一個(gè)解析器(運(yùn)行環(huán)境)才能運(yùn)行,若運(yùn)行在瀏覽器中,則瀏覽器就是JavaScript的解析器(運(yùn)行環(huán)境),而對(duì)于獨(dú)立運(yùn)行的js,Node.js就是一個(gè)解析器(運(yùn)行環(huán)境);

以CHrome瀏覽器為例,JavaScript運(yùn)行環(huán)境如下:

Node.js到底是什么?

而在Node.js中,JavaScript運(yùn)行環(huán)境如下:

Node.js到底是什么?

?Node.js通過(guò)Chrome V8將js翻譯成c或c++代碼,供底層使用;

與瀏覽器運(yùn)行環(huán)境相比,nodejs缺少了對(duì)dom的操作,增加了跨域請(qǐng)求/文件讀寫等功能;

Node.js到底是什么?與傳統(tǒng)服務(wù)器相比(如java服務(wù)器):

? ? 傳統(tǒng)服務(wù)器每次產(chǎn)生一個(gè)請(qǐng)求時(shí),則會(huì)生成一個(gè)線程(進(jìn)程);這樣就會(huì)產(chǎn)生一個(gè)問(wèn)題:

? ? ? ? ? ?由于請(qǐng)求的速度由用戶決定,響應(yīng)的速度可以通過(guò)提升帶寬等方法來(lái)提升速度。但是i/o的輸入輸出速度是比較難提升的。而每一個(gè)請(qǐng)求都會(huì)產(chǎn)生一個(gè)線程(橙色框),數(shù)據(jù)請(qǐng)求又比較慢就會(huì)出現(xiàn)很多線程在緩存中等待,從而造成大量的內(nèi)存浪費(fèi)。

? node服務(wù)器則采用單線程模式(橙色框),即不管產(chǎn)生多少請(qǐng)求都只有一個(gè)線程,這樣就可以大大節(jié)省內(nèi)存,降低成本;

Node.js到底是什么?

傳統(tǒng)服務(wù)器處理(java服務(wù)器),橙色框表示線程(多線程)

Node.js到底是什么?

node服務(wù)器處理??橙色框表示線程(單線程)

node特點(diǎn)如下:

  • 異步非阻塞的I/O(I/O線程池)
  • 特別適用于I/O密集型應(yīng)用
  • 事件循環(huán)機(jī)制
  • 單線程(處理不好cpu密集型任務(wù))
  • 跨平臺(tái)?
  • 回調(diào)函數(shù)嵌套過(guò)多(不足)
  • node中的全局對(duì)象是global,使用common.js模塊化方法

總而言之,

  • 當(dāng)JavaScript作為前端開發(fā)語(yǔ)言來(lái)說(shuō),需要在瀏覽器的環(huán)境上進(jìn)行
  • 當(dāng)JavaScript作為后端開發(fā)語(yǔ)言來(lái)說(shuō), 需要在node.js的環(huán)境上進(jìn)行

npm

npm全稱是Node Package Manager,即Node的包管理器(安裝完node后自動(dòng)安裝npm);通過(guò)npm可以對(duì)Node的包進(jìn)行搜索/下載/安裝/刪除/上傳等操作;

npm的包服務(wù)器是https://registry.npmjs.org

npm init // 初始化項(xiàng)目等package.json文件
npm search 包名// 搜索指定的包
npm install 包名// 安裝指定包
npm install 包名 --save 或 npm install 包名 -S// 安裝指定包并添加到項(xiàng)目的生產(chǎn)依賴中
npm install 包名 --save-dev 或 npm install 包名 -D// 安裝指定包并添加到項(xiàng)目的開發(fā)依賴中
npm install 包名 --g // 全局安裝指定包
npm install XXX@YYY // 安裝XXX包的YYY版本
npm install  // 安裝項(xiàng)目package.json中的所有依賴
npm remove 包名  // 刪除指定包,同時(shí)會(huì)移除package.json中的聲明

cnpm

因?yàn)閚pm的遠(yuǎn)程服務(wù)器在國(guó)外,所以會(huì)遇到訪問(wèn)過(guò)慢或無(wú)法訪問(wèn)的情況,所以淘寶搭建了一個(gè)國(guó)內(nèi)的npm服務(wù)器,它每隔10分鐘將國(guó)外npm服務(wù)器的所有內(nèi)容搬運(yùn)回國(guó)內(nèi)的服務(wù)器上,這樣我們就可以直接訪問(wèn)淘寶的國(guó)內(nèi)服務(wù)器了。鏡像地址是:https://registry.npm.taobao.org/

使用時(shí)將npm地址改為淘寶鏡像,命令依然使用與上述npm講解的命令;

npm config set registry https://registry.npm.taobao.org // 設(shè)置為淘寶鏡像
npm config get registry  // 查看npm地址是否設(shè)置成功,若為上面地址則設(shè)置成功

yarn

yarn的查找算法要比npm更精準(zhǔn),使用的依然是npm倉(cāng)庫(kù),在業(yè)界口碑更好;

npm install -g yarn // 全局安裝yarn

yarn的全局安裝位置與npm不同,要配置yarn的全局安裝路徑到環(huán)境變量中,否則全局安裝的包不起作用,具體操作如下:

yarn global dir // 查看全局安裝的yarn所在位置
yarn global bin // 查看全局安裝的yarn bin所在位置

將上述兩個(gè)命令的地址添加到環(huán)境變量中即可;

yarn操作包的指令如下:

yarn init // 初始化項(xiàng)目
yarn // 安裝項(xiàng)目package.json中所有依賴
yarn add xxx@yyy // 安裝xxx包的yyy版本
yarn add xxx@yyy -D // 下載指定開發(fā)依賴
yarn global add xxx // 全局下載指定包
yarn remove xxx // 刪除指定依賴包
yarn global remove xxx // 全局刪除指定依賴包

Buffer緩沖器

Buffer是一個(gè)和數(shù)組類似的對(duì)象,不同的是Buffer是專門用來(lái)保存二進(jìn)制數(shù)據(jù)的;

特點(diǎn):

  • 大小固定:在創(chuàng)建時(shí)就確定了,且無(wú)法調(diào)整;
  • 性能較好:直接對(duì)計(jì)算機(jī)的內(nèi)存進(jìn)行操作,效率高,存儲(chǔ)和讀取很快;
  • 每個(gè)元素大小為1字節(jié)(byte)---8bit
  • Buffer是Node中非常核心的模塊,無(wú)需下載,無(wú)需引入,直接即可使用;

創(chuàng)建Buffer

創(chuàng)建Buffer有三種方式:

let buff1 = Buffer.alloc(10); // 直接在堆里開辟一塊沒(méi)人用過(guò)的空間
console.log(buff1); // <Buffer 00 00 00 00 00 00 00 00 00 00> Buffer存儲(chǔ)的是二進(jìn)制,但是輸出時(shí)以16進(jìn)制展示

let buff2 = Buffer.allocUnsafe(10); // 在堆里開辟空間(該空間可能包含有被棄用的數(shù)據(jù)),性能好,但是容易造成數(shù)據(jù)泄露
console.log(buff2); // <Buffer 00 00 00 00 00 00 00 00 00 00>

let buff3 = Buffer.from('hello, Buffer');
// 將數(shù)據(jù)存入一個(gè)Buffer實(shí)例
console.log(buff3); // <Buffer 68 65 6c 6c 77 2c 20 42 75 66 66 65 72>

文件系統(tǒng)

所謂文件系統(tǒng),就是對(duì)計(jì)算機(jī)的文件進(jìn)行增刪改查等操作;Node提供了fs模塊專門用于操作文件;fs模塊是Node的核心模塊,只需引入即可使用;

文件寫入

  • writeFile(file, data[, options], callback)異步簡(jiǎn)單文件寫入方式? ? ?
// file 為要寫入的文件路徑+文件名+文件后綴
// data 為要寫入的數(shù)據(jù)
// options 配置項(xiàng)(可選參數(shù)), 包括:
      // encoding: 字符串格式,默認(rèn)是'utf8'
      // mode: 整數(shù)格式, 默認(rèn)是0o666 = 0o222+0o444
           // 0o111: 文件可被執(zhí)行的權(quán)限
           // 0o222: 文件可被寫入的權(quán)限
           // 0o444: 文件可被讀取的權(quán)限
      // flag: 標(biāo)識(shí)(打開文件要執(zhí)行的操作),默認(rèn)是'w' 
           // w(寫入,即覆蓋)
           // a(追加) 
// callback 回調(diào)函數(shù),傳入錯(cuò)誤對(duì)象err,若寫入成功,則err為空
let fs = require('fs') // node使用commonJs模塊方式
fs.writeFile(__dirname + '/1.txt', 'hello, node', (err) => {
    if (err) {
        console.log('寫入失敗');
    } else {
        console.log('寫入成功'); // 則在當(dāng)前文件夾下會(huì)生成1.txt文件,內(nèi)容為hello, node
    }
})
let fs = require('fs') // node使用commonJs模塊方式
fs.writeFile(__dirname + '/1.txt', 'hello, Thuesday', {flag: 'a'},  (err) => {
    if (err) {
        console.log('寫入失敗');
    } else {
        console.log('寫入成功'); // 則在當(dāng)前文件夾下會(huì)追加生成1.txt文件,內(nèi)容為hello, nodehello, Thuesday(因?yàn)?.txt中原本內(nèi)容為hello, node)
    }
})
  • createWriteStream(path[, options]) 異步流式文件寫入
// path 為要寫入的文件路徑+文件名+文件后綴
// options 配置項(xiàng)(可選參數(shù)), 包括:
      // encoding: 字符串格式,默認(rèn)是'utf8'
      // mode: 整數(shù)格式, 默認(rèn)是0o666 = 0o222+0o444
           // 0o111: 文件可被執(zhí)行的權(quán)限
           // 0o222: 文件可被寫入的權(quán)限
           // 0o444: 文件可被讀取的權(quán)限
      // flags: 標(biāo)識(shí)(打開文件要執(zhí)行的操作),默認(rèn)是'w' 
           // w(寫入,即覆蓋)
           // a(追加) 
      // fd: 文件統(tǒng)一標(biāo)識(shí)符,linux下文件標(biāo)識(shí)符,默認(rèn)是null
      // autoClose: 自動(dòng)關(guān)閉文件,默認(rèn)是true
      // emitClose: 默認(rèn)是false
      // start: 開始寫入的位置
let fs = require('fs') // node使用commonJs模塊方式
let ws = fs.createWriteStream(__dirname + '/2.txt')
// 監(jiān)視寫入流打開或關(guān)閉狀態(tài)
ws.on('open', () => {
    console.log('寫入流打開了');
})
ws.on('close', () => {
    console.log('寫入流關(guān)閉了');
})
ws.write('hello, new day') // 寫入數(shù)據(jù),成功后,在當(dāng)前文件夾下會(huì)生成2.txt文件,內(nèi)容為hello, new day
ws.write('ok, fine') 
ws.close() // 在node8版本中,使用close關(guān)閉會(huì)導(dǎo)致數(shù)據(jù)丟失,一般使用end()關(guān)閉流

?讀取文件

  • readFile(path[, options], callback) 異步讀取簡(jiǎn)單文件
// path 為要寫入的文件路徑+文件名+文件后綴
// options 配置項(xiàng)(可選參數(shù)), 包括:
      // encoding: 字符串格式,默認(rèn)是'utf8'
      // mode: 整數(shù)格式, 默認(rèn)是0o666 = 0o222+0o444
           // 0o111: 文件可被執(zhí)行的權(quán)限
           // 0o222: 文件可被寫入的權(quán)限
           // 0o444: 文件可被讀取的權(quán)限
      // flag: 標(biāo)識(shí)(打開文件要執(zhí)行的操作),默認(rèn)是'w' 
           // w(寫入,即覆蓋)
           // a(追加) 
// callback 回調(diào)函數(shù),傳入錯(cuò)誤對(duì)象err和成功數(shù)據(jù)data
let fs = require('fs')
fs.readFile(__dirname + '/1.txt', (err, data) => {
    if (err) {
        console.log('讀取失敗',err);
    } else {
        console.log('讀取成功', data); // 讀取成功 <Buffer 68 65 6c 6c 6f 2c 20 6 .... more bytes>
    }
})

fs讀出來(lái)的data數(shù)據(jù)是Buffer格式(因?yàn)椴灰欢ㄈ亲址袷剑灿锌赡苁橇髅襟w格式,存成Buffer后面好使用);

let fs = require('fs')
fs.readFile(__dirname + '/1.txt', (err, data) => {
    if (err) {
        console.log('讀取失敗',err);
    } else {
        console.log('讀取成功', data); // 讀取成功 <Buffer 68 65 6c 6c 6f 2c 20 6 .... more bytes>
        fs.writeFile(__dirname+'/3.txt', data, (err) => {
            if (err) {
               console.log('寫入失敗'); 
            } else {
               console.log('寫入成功');
            }
        })
    }
})
  • createReadStream(path[, options]) 流式文件讀取
// path 為要寫入的文件路徑+文件名+文件后綴
// options 配置項(xiàng)(可選參數(shù)), 包括:
      // encoding: 字符串格式,默認(rèn)是'utf8'
      // mode: 整數(shù)格式, 默認(rèn)是0o666 = 0o222+0o444
           // 0o111: 文件可被執(zhí)行的權(quán)限
           // 0o222: 文件可被寫入的權(quán)限
           // 0o444: 文件可被讀取的權(quán)限
      // flags: 標(biāo)識(shí)(打開文件要執(zhí)行的操作),默認(rèn)是'w' 
           // w(寫入,即覆蓋)
           // a(追加) 
      // fd: 文件統(tǒng)一標(biāo)識(shí)符,linux下文件標(biāo)識(shí)符,默認(rèn)是null
      // autoClose: 自動(dòng)關(guān)閉文件,默認(rèn)是true
      // emitClose: 默認(rèn)是false
      // start: 開始讀取的位置
      // end: 停止讀取的位置
      // highWaterMark: 每次讀取數(shù)據(jù)的大小,默認(rèn)是64*1024
let fs = require('fs') // node使用commonJs模塊方式
let rs = fs.createReadStream(__dirname + '/1.txt')
let ws = fs.createWriteStream(__dirname + '/4.txt')
rs.on('open', () => {
    console.log('可讀流打開了');
})
rs.on('close', () => {
    console.log('可讀流關(guān)閉了');
    ws.end() // 關(guān)閉寫入流,在可讀流讀完的時(shí)候,會(huì)自動(dòng)關(guān)閉,此時(shí)關(guān)閉寫入流最為合適
})
ws.on('open', () => {
    console.log('寫入流打開了');
})
ws.on('close', () => {
    console.log('寫入流關(guān)閉了');
})
rs.on('data', (data) => {
    // 對(duì)data事件進(jìn)行監(jiān)控,可以看到每次讀取的data是啥
    console.log(data, '每次讀取的data是啥');
    ws.write(data) // 寫入每次讀取的數(shù)據(jù)
})

簡(jiǎn)單文件寫入和簡(jiǎn)單文件讀取,都是一次性將所有要讀取或?qū)懭氲膬?nèi)容加到內(nèi)存中去,容易造成內(nèi)存泄露

http服務(wù)

node自帶有http模塊,可以直接引入使用即可;

分為三個(gè)步驟:

  • 引入node內(nèi)置的http模塊
let http = require('http')
  • 創(chuàng)建服務(wù)對(duì)象
let server = http.createServer(function(request, response) {
  // 其中request是請(qǐng)求對(duì)象, response是響應(yīng)對(duì)象
  response.setHeader('content-type', 'text/html;charset=utf8') // 可設(shè)置響應(yīng)頭
  response.end('返回的數(shù)據(jù)在這里傳回')
})
  • 指定服務(wù)器運(yùn)行的端口號(hào)并綁定監(jiān)聽
server.listen(端口號(hào), function(err) {
    if(!err) console.log('服務(wù)器啟動(dòng)成功')
    else console.log(err)
})

Express

node作為一個(gè)JavaScript運(yùn)行環(huán)境,提供了很多基礎(chǔ)的功能和API,基于node.js也衍生出了很多框架,如Express是一個(gè)基于Node.js平臺(tái)的極簡(jiǎn)、靈活的web應(yīng)用開發(fā)框架,它提供一系列強(qiáng)大的特性,幫助快速創(chuàng)建各種web和移動(dòng)設(shè)備應(yīng)用,官網(wǎng)見(jiàn)Express - Node.js web application framework

Express 框架核心特性:

  • 可設(shè)置中間件來(lái)響應(yīng)HTTP請(qǐng)求;
  • 定義了路由表用于執(zhí)行不同的HTTP請(qǐng)求動(dòng)作;
  • 可通過(guò)向模板傳遞參數(shù)來(lái)動(dòng)態(tài)渲染HTML頁(yè)面

基本使用方式如下:

const express = require('express') // 引入express
const app = express() // 創(chuàng)建app服務(wù)對(duì)象

// 配置理由,發(fā)送請(qǐng)求
app.get('xxx路由', function(request, response) {
    response.send('這里是后臺(tái)要返回的數(shù)據(jù)')  
})
// 通過(guò)app.get發(fā)送get請(qǐng)求,通過(guò)app.post發(fā)送post請(qǐng)求
//  response.send中返回后臺(tái)數(shù)據(jù)
// 指定服務(wù)器運(yùn)行的端口號(hào)并監(jiān)聽
app.listen(端口號(hào), function(err) {
    if(!err) console.log('服務(wù)器啟動(dòng)成功了')
    else console.log(err)
})

請(qǐng)求方法

express支持所有http請(qǐng)求方法,如get、post、delete、put以及all方法(用以支持restful API)等

app.METHOD(path, callback [, callback ...]) // 可傳入多個(gè)回調(diào)

示例:

app.all('/secret', (req, res, next) => {
  console.log('Accessing the secret section ...')
  next() // pass control to the next handler
})

?在路徑path中可以包含限定字符? (匹配前面字符零次或一次)、+(匹配前面字符一次或多次) *(任意字符) 以及括號(hào)();

app.get('/ab?cd', (req, res) => { // 匹配路徑/acd與/abcd
  res.send('ab?cd') 
})

app.get('/ab+cd', (req, res) => { // 匹配路徑/abcd、/abbcd、/abbbcd等等
  res.send('ab+cd')
})

app.get('/ab*cd', (req, res) => { // 匹配路徑/abcd /abxcd /ab1cd /ab1234cd等等
  res.send('ab*cd')
})

app.get('/ab(cd)?e', (req, res) => { // 匹配路徑/abe與/abcde
  res.send('ab(cd)?e')
})

可支持多個(gè)回調(diào)函數(shù)調(diào)用,但在每個(gè)回調(diào)結(jié)束記得要指定next(),此方法類似于后面要講的中間件方法~

app.get('/example/b', (req, res, next) => {
  console.log('the response will be sent by the next function ...')
  next()
}, (req, res) => {
  res.send('Hello from B!')
})

Request對(duì)象

Request對(duì)象是express中路由回調(diào)函數(shù)中的第一個(gè)參數(shù),代表了用戶發(fā)送給服務(wù)器的請(qǐng)求信息;

屬性/方法 描述
request.query

可獲取get請(qǐng)求查詢字符串的參數(shù),拿到的是一個(gè)對(duì)象,

如路由為/demo?name="team"&age="12",則request.query是{ name: "'team'", age: "'12'" }

request.params

可以獲取get請(qǐng)求參數(shù)路由的參數(shù),拿到的是一個(gè)對(duì)象

如路由為/demo/team/28,則request.params是{ name: 'team', age: '28' }

request.body 可以獲取post請(qǐng)求體,拿到的是一個(gè)對(duì)象(不可以直接用,要借助中間件)
request.get(xxx)

獲取請(qǐng)求頭中指定key對(duì)應(yīng)的value,

如console.log(request.get('HOST')), 輸出為localhost:3000

Response對(duì)象

屬性/方法 描述
response.send() 給瀏覽器的響應(yīng)
response.end() 結(jié)束響應(yīng)進(jìn)程
response.download() 給瀏覽器一個(gè)文件
response.sendFile() 給瀏覽器發(fā)送文件
response.redirect() 重定向到一個(gè)新的地址(url)
response.set(key, value) 自定義響應(yīng)頭key-value
response.get() 獲取響應(yīng)頭指定key值
response.status() 設(shè)置響應(yīng)狀態(tài)碼(一般不設(shè)置,由http自動(dòng)設(shè)置)
response.json() 返回json格式響應(yīng)
response.jsonp() 返回jsonp處理的json格式響應(yīng)

中間件

中間件本質(zhì)上就是一個(gè)函數(shù),包含三個(gè)參數(shù):request, response, next,其作用是:

  • 執(zhí)行任何代碼
  • 修改請(qǐng)求和響應(yīng)對(duì)象
  • 終結(jié)請(qǐng)求-響應(yīng)循環(huán)(讓一次請(qǐng)求得到響應(yīng))
  • 調(diào)用堆棧中的下一個(gè)中間件或路由

分為四種:

  • 應(yīng)用(全局)級(jí)中間件(用于過(guò)濾非法的請(qǐng)求,如防盜鏈)

第一種寫法:app.use((request, response, next) => { }) ,使用這種方式的中間件,則每個(gè)請(qǐng)求都會(huì)經(jīng)過(guò)此中間件進(jìn)行過(guò)濾

// demo.js
const express = require('express')

const app = express()

// 利用中間件防止盜鏈
app.use((request, response, next) => {
  if (request.get('Referer')) {
    const testReferer = request.get('Referer')
    console.log(testReferer)
    if (testReferer !== '要校驗(yàn)的某網(wǎng)站') {
      next()
    } else {
      response.send('無(wú)權(quán)使用該網(wǎng)站的圖片')
    }
  } else {
    // 若沒(méi)有網(wǎng)站來(lái)源,也放行
    next()
  }
})
app.get('/', function(request, response) {
  response.redirect('https://www.baidu.com')
})

第二種寫法: 使用函數(shù)定義,該種方法較為靈活,可靈活用在某個(gè)需要的地方

// demo.js
const express = require('express')

const app = express()

// 函數(shù)式中間件
function guard(request, response, next) {
  request.demo = 123 // 給request設(shè)置字段demo為123
  if (request.get('Referer')) {
    const testReferer = request.get('Referer')
    console.log(testReferer)
    if (testReferer !== '要校驗(yàn)的某網(wǎng)站') {
      next()
    } else {
      response.send('無(wú)權(quán)使用該網(wǎng)站的圖片')
    }
  } else {
    next()
  }
}
app.get('/', guard, function(request, response) {
  console.log(request.demo, 'request.demo')  // 123
  response.redirect('https://www.baidu.com')
})
  • 第三方中間件(通過(guò)包管理工具下載的中間件,如body-parser)

如app.use(bodyParser.urlencoded({extended: true})),該中間件用于解析post請(qǐng)求中的請(qǐng)求body;

npm install cookie-parser // 安裝第三方中間件

const express = require('express')
const app = express()
const cookieParser = require('cookie-parser')

// load the cookie-parsing middleware
app.use(cookieParser()) // 使用第三方
  • 內(nèi)置中間件(express內(nèi)置封裝好的中間件)

如app.use(express.urlencoded({extended: true})),與body-parser中間件功能一樣,用于解析post請(qǐng)求中的請(qǐng)求體參數(shù)

app.use(express.static('public')) ,用于暴露靜態(tài)資源

  • 路由器中間件Router

Router是一個(gè)完整的中間件和路由系統(tǒng),也可以看做是一個(gè)小型的app對(duì)象;它的存在是為了更好的管理路由對(duì)象;

使用express.Router()可以創(chuàng)建模塊化路由,然后作為中間件加載,如下示例:

// 子模塊路由,SubRouter.js
const express = require('express')
const router = express.Router()

// middleware that is specific to this router
router.use((req, res, next) => {
  console.log('Time: ', Date.now())
  next()
})
// define the home page route
router.get('/', (req, res) => {
  res.send('Birds home page')
})
// define the about route
router.get('/about', (req, res) => {
  res.send('About birds')
})

module.exports = router
//app.js 在app.js引入子路由模塊
const birds = require('./birds')

// ...

app.use('/birds', birds)

備注:在express中,定義路由和中間件的時(shí)候,根據(jù)定義的順序(代碼的順序),將定義的每一個(gè)中間件或路由,放在一個(gè)類似于數(shù)組的容器中,當(dāng)請(qǐng)求過(guò)來(lái)的時(shí)候,依次從容器中取出中間件和路由進(jìn)行匹配,若匹配成功,則交由該路由或中間件處理;

對(duì)于服務(wù)器來(lái)說(shuō),一次請(qǐng)求,只有一個(gè)請(qǐng)求對(duì)象,只有一個(gè)響應(yīng)對(duì)象,其它任何的request和response都是對(duì)二者的引用;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-453148.html

到了這里,關(guān)于Node.js到底是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 什么是EventEmitter?它在Node.js中有什么作用?

    什么是EventEmitter?它在Node.js中有什么作用?

    前端入門之旅:探索Web開發(fā)的奇妙世界 歡迎來(lái)到前端入門之旅!感興趣的可以訂閱本專欄哦!這個(gè)專欄是為那些對(duì)Web開發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無(wú)論你是完全的新手還是有一些基礎(chǔ)的開發(fā)者,這里都將為你提供一個(gè)系統(tǒng)而又親切的學(xué)習(xí)平臺(tái)。在這個(gè)

    2024年02月07日
    瀏覽(22)
  • 什么是Node.js的流(stream)?它們有什么作用?

    什么是Node.js的流(stream)?它們有什么作用?

    聚沙成塔·每天進(jìn)步一點(diǎn)點(diǎn) 前端入門之旅:探索Web開發(fā)的奇妙世界 歡迎來(lái)到前端入門之旅!感興趣的可以訂閱本專欄哦!這個(gè)專欄是為那些對(duì)Web開發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無(wú)論你是完全的新手還是有一些基礎(chǔ)的開發(fā)者,這里都將為你提供一個(gè)系統(tǒng)而

    2024年02月06日
    瀏覽(19)
  • node.js是干什么的

    node.js是干什么的

    Node.js是一個(gè)開源和跨平臺(tái)的JavaScript運(yùn)行時(shí)環(huán)境。它幾乎是任何類型項(xiàng)目的流行工具! Node.js在瀏覽器之外運(yùn)行V8 JavaScript引擎(Google Chrome的內(nèi)核)。這使得Node.js的性能非常好。 Node.js應(yīng)用程序在單個(gè)程序中運(yùn)行,無(wú)需為每個(gè)請(qǐng)求創(chuàng)建新的線程。Node.js在其標(biāo)準(zhǔn)庫(kù)中提供了一組異

    2023年04月09日
    瀏覽(20)
  • Node.js:execSync執(zhí)行一個(gè)shell命令

    默認(rèn)輸出是Buffer對(duì)象 需要轉(zhuǎn)為字符串 參考文章 https://www.runoob.com/nodejs/nodejs-process.html https://blog.csdn.net/weixin_43972437/article/details/130643741

    2024年02月15日
    瀏覽(16)
  • 用Node.js吭哧吭哧擼一個(gè)運(yùn)動(dòng)主頁(yè)

    用Node.js吭哧吭哧擼一個(gè)運(yùn)動(dòng)主頁(yè)

    某乎問(wèn)題:人這一生,應(yīng)該養(yǎng)成哪些好習(xí)慣? 問(wèn)題鏈接:https://www.zhihu.com/question/460674063 如果我來(lái)回答肯定會(huì)有 定期運(yùn)動(dòng) 的字眼。 平日里也有煅練的習(xí)慣,時(shí)間久了后一直想把運(yùn)動(dòng)數(shù)據(jù)公開,可惜某運(yùn)動(dòng)軟件未開放公共的接口出來(lái)。 幸運(yùn)的是,在Github平臺(tái)沖浪我發(fā)現(xiàn)了有同

    2024年02月12日
    瀏覽(19)
  • 使用node.js給前端發(fā)送一個(gè)圖像驗(yàn)證碼

    相信寫過(guò)node的小伙伴都對(duì)此有相關(guān)了解 首先導(dǎo)入需要的包(//后有解釋) const mysql = require(\\\"mysql\\\"); ? //用于創(chuàng)建和管理 MySQL 連接池。 const express = require(\\\"express\\\");//用于構(gòu)建 Web 應(yīng)用程序。 const app = express(); const interface = require(\\\"./interface\\\"); const bodyParser = require(\\\"body-parser\\\"); //用于

    2024年01月17日
    瀏覽(28)
  • 用node.js搭建一個(gè)視頻推流服務(wù)

    用node.js搭建一個(gè)視頻推流服務(wù)

    由于業(yè)務(wù)中有不少視頻使用的場(chǎng)景,今天來(lái)說(shuō)說(shuō)如何使用node完成一個(gè)視頻推流服務(wù)。 先看看效果: 這里的播放的視頻是一個(gè)多個(gè)Partial Content組合起來(lái)的,每個(gè)Partial Content大小是1M。 一,項(xiàng)目搭建 (1)初始化項(xiàng)目,創(chuàng)建package.json (2)安裝express和nodemon (3)創(chuàng)建html文件 (

    2024年02月13日
    瀏覽(22)
  • 哪一個(gè)更好?Spring boot還是Node.js

    哪一個(gè)更好?Spring boot還是Node.js

    本篇文章有些與眾不同,由于我自己手頭有些關(guān)于這個(gè)主題的個(gè)人經(jīng)驗(yàn),受其啟發(fā)寫出此文。雖然SpringBoot和Node.js服務(wù)于很不一樣的場(chǎng)景,但是這兩個(gè)框架共性驚人。其實(shí)每種語(yǔ)言都有不計(jì)其數(shù)的框架,但僅僅一部分是真正卓越的。如果咱們想,你和我也能創(chuàng)造我們自己的框

    2024年02月08日
    瀏覽(17)
  • node.js 簡(jiǎn)單實(shí)驗(yàn) 創(chuàng)建一個(gè)簡(jiǎn)單的web服務(wù)

    node.js 簡(jiǎn)單實(shí)驗(yàn) 創(chuàng)建一個(gè)簡(jiǎn)單的web服務(wù)

    概要:用一個(gè)最簡(jiǎn)單是例子感受一下node.js 的能力 1.代碼 2.運(yùn)行結(jié)果 2.1 node t.js 1.2 http://127.0.0.1:8081? ? ? ?

    2024年02月11日
    瀏覽(25)
  • node.js 什么是模板引擎?(具體介紹underscore)

    前言:在 Web 開發(fā)中,數(shù)據(jù)的呈現(xiàn)通常是基于 HTML 和 CSS 的,而數(shù)據(jù)的變化又是非常頻繁的,需要根據(jù)數(shù)據(jù)動(dòng)態(tài)生成 HTML 標(biāo)記。手動(dòng)拼接 HTML 標(biāo)記顯然是一種非常低效的方式,不僅容易出錯(cuò),而且難以維護(hù)。使用,我們使用到了模板引擎來(lái)解決這一問(wèn)題。? 模板引擎是一種將數(shù)

    2024年04月23日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包