前端面試2021(NodeJS篇)

1.什么是NodeJS,NodeJS有哪些特點(diǎn)

NodeJS是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行時(shí)環(huán)境
JavaScript運(yùn)行時(shí)環(huán)境:可以脫離了瀏覽器環(huán)境,直接運(yùn)行js代碼
基于Chrome V8 引擎:解釋執(zhí)行js代碼的效率非常高
非阻塞IO:NodeJS環(huán)境中提供了同步和異步的文件IO處理

2.使用NodeJS的文件模塊,使用同步的方式創(chuàng)建文件并向文件中寫(xiě)入文本數(shù)據(jù)

         const fs = require('fs')
        const fd = fs.openSync(__dirname+'/index.html','w')
        fs.writeSync(fd,'內(nèi)容')
        fs.closeSync(fd)
    fs.writeFileSync(__dirname + '/index.html', '內(nèi)容')

3.使用NodeJs的文件模塊,使用同步的方式從文件中讀取內(nèi)容并展示到頁(yè)面中

         const fs = require('fs')
        const fd = fs.openSync(__dirname + '/index.html')
        const content = fs.readSync(fd, 'utf-8')
        fs.closeSync(fd)
    const content = fs.readFileSync(__dirname + '/index.html', 'utf-8')

4.簡(jiǎn)述NodeJS的文件模塊,同步操作函數(shù)和異步操作函數(shù)的優(yōu)缺點(diǎn)

同步函數(shù)的特點(diǎn),編寫(xiě)的代碼,從上到下按照編寫(xiě)順序依次執(zhí)行,上一行代碼沒(méi)有執(zhí)行完成的情況下,下一行代碼處于阻塞、等待狀態(tài)
優(yōu)點(diǎn):如果編寫(xiě)的代碼,后面的代碼需要依賴(lài)前面代碼的執(zhí)行結(jié)果,此時(shí)同步方式更加符合開(kāi)發(fā)習(xí)慣
缺點(diǎn):在一些代碼互相沒(méi)有依賴(lài)的情況下,同步執(zhí)行的代碼比較消耗時(shí)間
異步函數(shù)的特點(diǎn),編寫(xiě)代碼從上到下的順序,但是執(zhí)行過(guò)程中下一行代碼不會(huì)等待上一行代碼執(zhí)行完成后采取執(zhí)行,而是上一行代碼開(kāi)始執(zhí)行,下一行代碼緊接著直接執(zhí)行
優(yōu)點(diǎn):如果編寫(xiě)的代碼,后面的代碼和前面的代碼如果沒(méi)有依賴(lài)關(guān)系,異步執(zhí)行的方式更加節(jié)省時(shí)間,在效率上有很大的提升
缺點(diǎn):在一些代碼互相有依賴(lài)的情況下, 編寫(xiě)方式只能通過(guò)回調(diào)函數(shù)的方式執(zhí)行,否則直接按照順序方式編寫(xiě)的代碼執(zhí)行會(huì)出現(xiàn)問(wèn)題

5.NodeJS如何初始化項(xiàng)目應(yīng)用

NodeJS為了方便前端/后端項(xiàng)目的獨(dú)立管理,通過(guò)node init命令初始化一個(gè)項(xiàng)目文件夾為NodeJS應(yīng)用,初始化完成后會(huì)在文件夾中生成標(biāo)志性配置文件package.json,文件中存儲(chǔ)了當(dāng)前項(xiàng)目的初始配置

6.簡(jiǎn)述package.json配置文件中都有哪些常見(jiàn)配置項(xiàng)

package.json配置文件是NodeJS應(yīng)用標(biāo)志性配置文件,包含了
name :項(xiàng)目名稱(chēng)
author:項(xiàng)目作者
version:項(xiàng)目版本
scripts:項(xiàng)目腳本命令
dependencied:項(xiàng)目第三方依賴(lài)
main:項(xiàng)目入口文件

7.NodeJS中如何添加第三方模塊

一般情況下會(huì)用node init命令初始化一個(gè)Node應(yīng)用,然后在應(yīng)用中通過(guò)npm命令安裝第三方模塊
npm install <模塊名稱(chēng)> -g
或 npm install <模塊名稱(chēng)> -S

8.npm命令安裝模塊,添加-g選項(xiàng)和-S選項(xiàng)有什么區(qū)別

-g選項(xiàng)表示全局安裝,安裝的模塊在當(dāng)前計(jì)算機(jī)中的任何NodeJS應(yīng)用中都可以訪(fǎng)問(wèn)
-S選項(xiàng)表示局部安裝/項(xiàng)目安裝,安裝的模塊只在當(dāng)前項(xiàng)目中使用,項(xiàng)目開(kāi)發(fā)中除了通過(guò)模塊之外建議使用項(xiàng)目安裝的方式

9.什么是模塊化,什么是模塊化開(kāi)發(fā)

模塊化就是將項(xiàng)目中不同的功能拆分成多個(gè)獨(dú)立的模塊,通過(guò)模塊之間的互相組合完成一定功能的操作過(guò)程
模塊化開(kāi)發(fā)就是完成模塊化拆分和最后的模塊化合并的開(kāi)發(fā)模式

10.module.exports和exports有什么區(qū)別

NodeJS模塊化開(kāi)發(fā)時(shí),遵循CommonJS規(guī)范的情況下導(dǎo)出模塊使用的對(duì)象
module式NodeJS給js模塊提供的一個(gè)內(nèi)置對(duì)象,一般指代當(dāng)前js文件/模塊
module對(duì)象中包含了一個(gè)對(duì)象exports用于導(dǎo)出數(shù)據(jù),同時(shí)NodeJS為了方便數(shù)據(jù)導(dǎo)出操作,通過(guò)引用賦值的方式將module.exports賦值給exports,可以使用exports導(dǎo)出數(shù)據(jù),具體使用時(shí)需要注意模塊實(shí)際導(dǎo)出數(shù)據(jù)使用的依然是module.exports,所以在這兩個(gè)關(guān)鍵詞混合操作時(shí)注意導(dǎo)出數(shù)據(jù)的有效性問(wèn)題

11.http模塊如何創(chuàng)建并啟動(dòng)一個(gè)web服務(wù)

const http = require('http')
const server = http.createServer((req,res)=>{
      //接收并處理用戶(hù)請(qǐng)求
})
server.listen(3000,'0.0.0.0',err=>{
    err ? console.log(err) : console.log('服務(wù)器正常啟動(dòng))
})

12.什么是IP地址,什么是端口,什么是網(wǎng)絡(luò)協(xié)議,你都知道哪些常見(jiàn)的網(wǎng)絡(luò)協(xié)議

IP地址:全程Internet Protocol,網(wǎng)際互聯(lián)協(xié)議,主要用于規(guī)范和描述在互聯(lián)網(wǎng)上給你的計(jì)算機(jī)之間的網(wǎng)絡(luò)連接;具體體現(xiàn)在使用固定的規(guī)則表示互聯(lián)上的唯一計(jì)算機(jī)
IP地址主要使用版本使用二進(jìn)制表示表示的IPv4和使用十六進(jìn)制表示的IPv6,現(xiàn)階段主流IP地址主要是IPv4,IPv6地址已經(jīng)開(kāi)始部署使用,但是軟件開(kāi)發(fā)時(shí)依然沒(méi)有作為主要的參考地址
端口:全稱(chēng)port,數(shù)據(jù)通信端口,描述了一臺(tái)計(jì)算機(jī)上可以安裝很多軟件,每個(gè)軟件連接網(wǎng)絡(luò)的時(shí)候都需要數(shù)據(jù)通信,端口的出現(xiàn)就是為了保證每個(gè)軟件都可以獨(dú)立的進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)通信
網(wǎng)絡(luò)協(xié)議:全程protocol,網(wǎng)絡(luò)數(shù)據(jù)通信協(xié)議,描述了工作在網(wǎng)絡(luò)上的多臺(tái)計(jì)算機(jī)進(jìn)行數(shù)據(jù)正確的共享的格式和規(guī)則
常見(jiàn)的網(wǎng)絡(luò)協(xié)議:
ftp:file transfer protocol 文件傳輸協(xié)議
http : hyper text transfer protocol 超文本傳輸協(xié)議
https: hyper text transfer protocol security 安全的超文本傳輸協(xié)議
smtp:simple mail transfer protocol 簡(jiǎn)單郵件傳輸協(xié)議
ssh:security shell 安全外殼協(xié)議,也成為安全隧道協(xié)議
TCP:Transfer Control Protocol 傳輸控制協(xié)議

13.簡(jiǎn)述一個(gè)請(qǐng)求從發(fā)起到看到了瀏覽器頁(yè)面的過(guò)程中都發(fā)生了什么事

瀏覽器輸入U(xiǎn)RL地址發(fā)起請(qǐng)求后
-工作在網(wǎng)絡(luò)上的DNS域名解析服務(wù)器接收到的域名,解析出域名對(duì)應(yīng)的IP地址
-請(qǐng)求繼續(xù)向具體的IP地址發(fā)送,由網(wǎng)絡(luò)上IP地址對(duì)應(yīng)的服務(wù)器主機(jī)接收到請(qǐng)求
-服務(wù)器主機(jī)根據(jù)請(qǐng)求端口,找到服務(wù)器主機(jī)上端口對(duì)應(yīng)的WEB服務(wù)器
-WEB服務(wù)器根據(jù)請(qǐng)求路徑,交給對(duì)應(yīng)的業(yè)務(wù)模塊進(jìn)行對(duì)應(yīng)的業(yè)務(wù)處理,包裝處理結(jié)果

-處理結(jié)果包裝成響應(yīng)數(shù)據(jù),返回給客戶(hù)端
-客戶(hù)端瀏覽器解析響應(yīng)數(shù)據(jù),渲染展示對(duì)應(yīng)的頁(yè)面

14.簡(jiǎn)述HTTP和HTTPS協(xié)議的聯(lián)系和區(qū)別

HTTP協(xié)議和HTTPS協(xié)議,都是超文本傳輸協(xié)議,HTTPS提供了安全數(shù)據(jù)通道,讓工作在網(wǎng)絡(luò)上的超文本數(shù)據(jù)在傳輸?shù)臅r(shí)候具備了保密功能,保障了數(shù)據(jù)的安全傳輸

15.什么是同步,什么是異步,項(xiàng)目中你是怎么使用的

同步是多個(gè)任務(wù)按照順序執(zhí)行,前面的任務(wù)執(zhí)行完成后才能開(kāi)始執(zhí)行下一個(gè)任務(wù)
異步是多個(gè)任務(wù)按照?qǐng)?zhí)行順序同時(shí)調(diào)用執(zhí)行,前面的任務(wù)執(zhí)行是否完成不影響下一個(gè)任務(wù)的執(zhí)行過(guò)程
項(xiàng)目開(kāi)發(fā)中如果上一個(gè)執(zhí)行任務(wù)的結(jié)果,對(duì)下一個(gè)任務(wù)有影響,需要按照同步的方式進(jìn)行處理,如讀取HTML文件內(nèi)容響應(yīng)給用戶(hù)的操作
項(xiàng)目開(kāi)發(fā)中如果上一個(gè)執(zhí)行任務(wù)的結(jié)果,對(duì)下一個(gè)任務(wù)沒(méi)有影響,可以通過(guò)異步的方式進(jìn)行處理,如Node http模塊中監(jiān)聽(tīng)請(qǐng)求和啟動(dòng)服務(wù)就可以執(zhí)行異步處理

16.npm 命令的作用是什么?都有哪些常見(jiàn)的操作命令

npm命令主要用于管理NodeJS環(huán)境中的第三方模塊
npm instal 安裝依賴(lài)
npm config 用于配置信息
npm uninstall 卸載依賴(lài)

17.JavaScript、NodeJS和Express有什么區(qū)別和聯(lián)系

Javascript是一個(gè)編程語(yǔ)言
NodeJS是一個(gè)Javascript運(yùn)行時(shí)環(huán)境
Express是一個(gè)基于NodeJS的WEB應(yīng)用開(kāi)發(fā)框架

18.什么是路由

路由是WEB應(yīng)用開(kāi)發(fā)中的一個(gè)組件,用于接收用戶(hù)請(qǐng)求并分發(fā)到不同的業(yè)務(wù)函數(shù)進(jìn)行處理的過(guò)程,路由主要包含請(qǐng)求地址和處理函數(shù)映射關(guān)系

19.簡(jiǎn)述GET請(qǐng)求和POST請(qǐng)求的聯(lián)系個(gè)區(qū)別

GET請(qǐng)求和POST請(qǐng)求都是HTTP1.1規(guī)范中的請(qǐng)求方式
GET請(qǐng)求主要描述向服務(wù)器獲取數(shù)據(jù)的請(qǐng)求,可以附帶參數(shù),參數(shù)會(huì)出現(xiàn)在URL地址的最后面?符號(hào)的后面,以明文的形式進(jìn)行傳遞,參數(shù)只能傳遞字符串
POST請(qǐng)求主要描述向服務(wù)器請(qǐng)求新增數(shù)據(jù),可以附帶參數(shù),參數(shù)包含在請(qǐng)求體中不會(huì)顯示在可視界面上,參數(shù)可以是任意類(lèi)型的數(shù)據(jù)

20.Express中如何處理靜態(tài)資源的

Express中通過(guò)內(nèi)置中間件處理靜態(tài)資源
app.use(express.static("靜態(tài)文件存放文件夾名稱(chēng)"))

21.GET請(qǐng)求的參數(shù)有什么特點(diǎn),Express中怎么接收的

GET請(qǐng)求主要是瀏覽器中的地址欄、超鏈接、<link>、<script src="">
發(fā)起的請(qǐng)求,可以在發(fā)送請(qǐng)求時(shí)附帶字符串參數(shù),參數(shù)會(huì)展示在瀏覽器地址上

22.POST請(qǐng)求的參數(shù)有什么特點(diǎn),Exprss中怎么接收的

POST請(qǐng)求通過(guò)表單設(shè)置method="POST"進(jìn)行發(fā)送的,請(qǐng)求中可以附帶參數(shù),參數(shù)可以是任意類(lèi)型的數(shù)據(jù)
Express中首先設(shè)置中間件(內(nèi)置中間件、或者第三方中間件)
app.use(express.urlencoded({extended:false})
app.use(express.json())
Express中通過(guò)請(qǐng)求對(duì)象request接收POST參數(shù):request.body

23.REST請(qǐng)求的參數(shù)有什么特點(diǎn),Express中怎么接收的

REST請(qǐng)求是近些年前后端分離開(kāi)發(fā)出現(xiàn)后,出現(xiàn)的一種新的請(qǐng)求模式,可以發(fā)送GET/POST/PUT/DELETE等任意方式的請(qǐng)求完成數(shù)據(jù)的增刪改拆,請(qǐng)求發(fā)送的過(guò)程中可以附帶參數(shù),參數(shù)包含在URL路徑中
Express中通過(guò)請(qǐng)求對(duì)象request接受REST風(fēng)格的參數(shù):request.params

24.Express中怎么給客戶(hù)端返回?cái)?shù)據(jù)的,如何返回不同類(lèi)型的數(shù)據(jù)

Express中通過(guò)響應(yīng)對(duì)象response給客戶(hù)端返回?cái)?shù)據(jù)
response.send(str | obj)可以響應(yīng)字符串?dāng)?shù)據(jù)或者其他對(duì)象數(shù)據(jù)
response.sendFile(file)可以響應(yīng)具體文件數(shù)據(jù)

25.簡(jiǎn)述常見(jiàn)的NodeJS模塊

NodeJS是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境,提供了大量的操作模塊
path: 用于操作文件路徑的內(nèi)置模塊
url:用于操作URL網(wǎng)址的內(nèi)置模塊
fs: 用于操作文件系統(tǒng)的內(nèi)置模塊
http:用于操作網(wǎng)絡(luò)服務(wù)的內(nèi)置模塊
querystring: 用于處理查詢(xún)字符串的內(nèi)置模塊
express: 用于開(kāi)發(fā)WEB應(yīng)用的第三方模塊/框架
body-parser:用于處理POST參數(shù)的第三方模塊
tirm: 用于處理字符串空格的第三方模塊
qs:用于處理查詢(xún)字符串的第三方模塊

26.如何通過(guò)NodeJS開(kāi)發(fā)一個(gè)服務(wù)端應(yīng)用

使用nodejs的http內(nèi)建模塊開(kāi)發(fā)
const http = require('http')
const server = http.createServer()
server.listen(3000,err=>{
console.log('服務(wù)啟動(dòng)了')
})

27.如何使用Express開(kāi)發(fā)一個(gè)服務(wù)端模塊化應(yīng)用

Express是一個(gè)基于NodeJS實(shí)現(xiàn)的web應(yīng)用開(kāi)發(fā)框架,通過(guò)自己的路由機(jī)制完成模塊化開(kāi)發(fā),根據(jù)功能或者角色或者其他依據(jù),將模塊進(jìn)行拆分,最后在app.js入口模塊中進(jìn)行統(tǒng)一的注冊(cè)引入
子模塊:
const express = require('express')
const router = express.Router()
//定義子模塊路由
routerr.get(路徑,處理函數(shù))
module.express = router
app.js主模塊
const express = require('express')
const 子模塊 = require('./routes/子模塊')
const app = express()
app.use(前綴路徑,子模塊)
app.listen(端口 ,err=>處理函數(shù))

28.如何理解普通文件夾、Git管理的項(xiàng)目、NodeJS應(yīng)用項(xiàng)目、Express web項(xiàng)目

普通文件夾,可以作為項(xiàng)目的基本文件夾存在,保存項(xiàng)目中所有的文件內(nèi)容
git管理的項(xiàng)目,可以將普通文件夾通過(guò)git init命令初始化為git管理的項(xiàng)目,普通文件夾就支持git版本管理功能
NodeJS應(yīng)用,進(jìn)行前端/服務(wù)端應(yīng)用開(kāi)發(fā)時(shí)為了更好的管理第三方依賴(lài),可以通過(guò)npm init命令將普通文件夾初始化為nodejs應(yīng)用,更方便的進(jìn)行項(xiàng)目的開(kāi)發(fā)和維護(hù)
Express web應(yīng)用,進(jìn)行服務(wù)端應(yīng)用開(kāi)發(fā)時(shí)創(chuàng)建的NodeJS應(yīng)用

29.Npm如何安裝配置全局模塊、如何安裝配置局部模塊,它們有什么區(qū)別

安裝全局模塊: npm install 模塊名稱(chēng) -g
安裝局部模塊: npm install 模塊名稱(chēng) -S
全局安裝的模塊在當(dāng)前計(jì)算機(jī)中所有的node項(xiàng)目中都可以使用
局部安裝的模塊只能在當(dāng)前項(xiàng)目中使用

30.npm是如何管理全局和局部依賴(lài)的,有什么其他的替代的方案嗎

npm 是一個(gè)nodejs包管理器
全局依賴(lài):npm在安裝全局依賴(lài)時(shí),將依賴(lài)的模塊文件下載到計(jì)算機(jī)node應(yīng)用指定的全局文件夾中,提供給當(dāng)前計(jì)算機(jī)中所有項(xiàng)目使用
局部依賴(lài):npm在安裝局部依賴(lài)時(shí),將依賴(lài)的模塊下載到當(dāng)前項(xiàng)目中的node_modues/文件中,提供給當(dāng)前項(xiàng)目使用
npm管理依賴(lài)的方式已經(jīng)非常完善了,在新的項(xiàng)目模塊管理中,除了使用npm意外,還可以使用cnpm、pm2、yarn,yum...

31.如何創(chuàng)建并啟動(dòng)一個(gè)Express服務(wù)應(yīng)用

const express = require('express')
const app = express()
app.listen(3000,err=>{console.log('服務(wù)已經(jīng)啟動(dòng)')})

32.什么是路由?Express中是如何管理路由的

路由是WEB服務(wù)器中,對(duì)用戶(hù)的請(qǐng)求進(jìn)行分發(fā),交給對(duì)應(yīng)的業(yè)務(wù)處理函數(shù)進(jìn)行業(yè)務(wù)受理的一種操作模式
Express中包含了入口模塊中的路由express(),以及模塊化拆分后的子路由對(duì)象express.Router(),創(chuàng)建的子路由對(duì)象使用固定語(yǔ)法user()函數(shù)完成子路由注冊(cè)和使用

33.什么是中間件,Express中有哪些不同的中間件

中間件是工作在客戶(hù)端和服務(wù)器之間的中間組件,主要用于攔截請(qǐng)求和響應(yīng),對(duì)請(qǐng)求和響應(yīng)進(jìn)行功能擴(kuò)展的中間組件
Express中主要包含三種中間件,分別是內(nèi)置中間件、第三方中間件以及自定義中間件

34.常見(jiàn)的網(wǎng)絡(luò)協(xié)議都有哪些,常見(jiàn)的網(wǎng)絡(luò)端口都有哪些

常見(jiàn)的網(wǎng)絡(luò)協(xié)議HTTP超文本傳輸協(xié)議、HTTPS提供安全數(shù)據(jù)通道的超文本傳輸協(xié)議、FTP文件傳輸協(xié)議、SMTP簡(jiǎn)單郵件協(xié)議、SSH安全外殼協(xié)議/隧道協(xié)議、TCP傳輸控制協(xié)議、UDP廣播協(xié)議、IP數(shù)據(jù)包協(xié)議...
常見(jiàn)的網(wǎng)絡(luò)端口HTTP協(xié)議使用的80端口、HTTPS協(xié)議使用的443端口、FTP協(xié)議使用的20/21端口、SSH協(xié)議使用的22端口,SMTP協(xié)議使用的25端口、mysql數(shù)據(jù)庫(kù)使用的3306端口...

35.GET 請(qǐng)求和POST請(qǐng)求的聯(lián)系和區(qū)別

GET請(qǐng)求和POST請(qǐng)求都是HTTP1.1規(guī)范的請(qǐng)求格式
GET請(qǐng)求用于向服務(wù)器請(qǐng)求獲取數(shù)據(jù),請(qǐng)求中可以附帶參數(shù),參數(shù)類(lèi)型只能是字符串?dāng)?shù)據(jù),并且參數(shù)在傳輸?shù)臅r(shí)候會(huì)展示是在URL地址中不利于數(shù)據(jù)安全,參數(shù)的長(zhǎng)度受到限制
POST請(qǐng)求用于向服務(wù)器請(qǐng)求新增數(shù)據(jù),請(qǐng)求中可以附帶參數(shù),參數(shù)類(lèi)型可以是任意類(lèi)型的數(shù)據(jù),參數(shù)會(huì)包含在請(qǐng)求體(request body)中進(jìn)行傳遞,具有一定的數(shù)據(jù)保密性

36.什么是session,什么是cookie,它們有什么聯(lián)系和區(qū)別

session標(biāo)識(shí)客戶(hù)端和服務(wù)器之間的會(huì)話(huà)
cookie表示客戶(hù)端存儲(chǔ)的臨時(shí)數(shù)據(jù)
WEB應(yīng)用開(kāi)發(fā)中會(huì)話(huà)跟蹤技術(shù)或者狀態(tài)保持技術(shù)中可以使用session完成會(huì)話(huà)跟蹤,通過(guò)cookie記錄在客戶(hù)端的數(shù)據(jù)完成狀態(tài)保持,session和cookie都會(huì)一起使用
session是存儲(chǔ)在服務(wù)端的,可以存儲(chǔ)任意類(lèi)型的數(shù)據(jù),需要注意的是沒(méi)有必要的情況下盡量不要在session中存儲(chǔ)大量數(shù)據(jù),導(dǎo)致服務(wù)器存儲(chǔ)空間出現(xiàn)問(wèn)題
cookie是存儲(chǔ)在客戶(hù)端的,只能字符串類(lèi)型的數(shù)據(jù),需要注意的是不同 的瀏覽器對(duì)于存儲(chǔ)的cookie數(shù)據(jù)大小也是有限制的,一般數(shù)據(jù)量不要求超過(guò)4k字節(jié)的數(shù)據(jù)

37.為什么說(shuō)HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,項(xiàng)目中怎么解決這種無(wú)狀態(tài)問(wèn)題的呢

HTTP協(xié)議模式下,瀏覽器訪(fǎng)問(wèn)服務(wù)器數(shù)據(jù),一旦數(shù)據(jù)成功響應(yīng),客戶(hù)端和服務(wù)器之間的連接就會(huì)斷開(kāi),保持連接的狀態(tài)也就斷開(kāi),所以說(shuō)HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議
項(xiàng)目中通過(guò)會(huì)話(huà)跟蹤技術(shù),通過(guò)session和cookie的使用解決無(wú)狀態(tài)數(shù)據(jù)保持

38.項(xiàng)目中某些路徑需要登錄才能訪(fǎng)問(wèn),Express中怎么解決未登錄用戶(hù)限制訪(fǎng)問(wèn)的問(wèn)題

用戶(hù)的登錄主要通過(guò)狀態(tài)保持技術(shù)實(shí)現(xiàn),所以可以在需要登錄的路由中進(jìn)行登錄判斷,未登錄用戶(hù)限制訪(fǎng)問(wèn)即可,但是這樣的操作不利于大量限制函數(shù)
Express中可以通過(guò)自定義中間件,攔截所有的請(qǐng)求,在所有業(yè)務(wù)請(qǐng)求處理之前進(jìn)行登錄身份驗(yàn)證,未登錄的情況下限制訪(fǎng)問(wèn)跳轉(zhuǎn)到登錄頁(yè)面

//1.express中的中間件工作順序
app.use(express.static('public'))
//2.自定義中間件(所有請(qǐng)求之前執(zhí)行)
app.use((req,res,next)=>{
      .....
       next()
})
//3.執(zhí)行請(qǐng)求處理,路由
app.use('/path',module)
//4.錯(cuò)誤中間件:自定義中間件
app.use((req,res,next)=>{
      res.status(404)
    .....
})

39.什么是NodeJS,談?wù)勀銓?duì)NodeJS的認(rèn)識(shí)

NodeJS是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境,支持了JavaScript服務(wù)端應(yīng)用開(kāi)發(fā)場(chǎng)景,NodeJS本身具有單線(xiàn)程、事件驅(qū)動(dòng)、Chrome V8引擎、JavaScript運(yùn)行時(shí)等特點(diǎn),NodeJS和其他的后端語(yǔ)言環(huán)境相比較,技術(shù)發(fā)展更迅速,版本迭代更快,所以一般要求穩(wěn)定性較高的后端項(xiàng)目開(kāi)發(fā)很少會(huì)直接選擇NodeJS進(jìn)行開(kāi)發(fā),但是NodeJS本身具備的特性一方面可以支持后端開(kāi)發(fā),以后隨著新特性的添加發(fā)展會(huì)更好,另一方面NodeJS對(duì)于前端開(kāi)發(fā)框架的支持非常友好

40為什么說(shuō)NodeJS是事件驅(qū)動(dòng)的,底層實(shí)現(xiàn)邏輯是什么樣的

NodeJS底層是單線(xiàn)程運(yùn)行機(jī)制,常規(guī)情況下每次都只能服務(wù)一個(gè)請(qǐng)求,操作效率就會(huì)非常低下,為了提高請(qǐng)求處理效率,讓NodeJS應(yīng)用可以同時(shí)服務(wù)多個(gè)請(qǐng)求,提供了自己的事件驅(qū)動(dòng)機(jī)制,在單線(xiàn)程接收到請(qǐng)求之后直接分發(fā)給后端處理函數(shù)進(jìn)行處理,在處理過(guò)程中就可以將請(qǐng)求臨時(shí)掛起,繼續(xù)處理后續(xù)的請(qǐng)求,可以在相同的時(shí)間段處理更多的請(qǐng)求,被處理的請(qǐng)求處理完成后通過(guò)事件通知單線(xiàn)程找回請(qǐng)求并且及逆行響應(yīng),所以NodeJS是單線(xiàn)程工作機(jī)制、同時(shí)包含了事件驅(qū)動(dòng)的工作方式高效率的處理并發(fā)請(qǐng)求,底層是通過(guò)EmitEvent對(duì)象實(shí)現(xiàn)時(shí)間創(chuàng)建和觸發(fā)工作的

41.在項(xiàng)目中你都用過(guò)哪些Node相關(guān)的模塊,簡(jiǎn)單描述一下它們的含義

fs 文件操作模塊
http web 服務(wù)模塊
path 路徑處理模塊
url 地址處理模塊
trim 空格處理模塊
querystring 查詢(xún)字符串處理模塊
express web應(yīng)用開(kāi)發(fā)框架
qs 查詢(xún)字符串處理模塊
express-session 會(huì)話(huà)管理里模塊
parse-cookie cookie數(shù)據(jù)管理模塊
svg-captcha驗(yàn)證碼模塊
serve-favicon 服務(wù)器LOGO模塊

42.Express中都用過(guò)哪些中間件

中間件一般包含內(nèi)置中間件、第三方中間件和自定義中間件
內(nèi)置中間件如靜態(tài)文件處理、POST參數(shù)處理中間件等等
第三方中間件如POST參數(shù)、session會(huì)話(huà)管理、cookie數(shù)據(jù)管理、formidable文件上傳、svg-captcha驗(yàn)證碼等等
自定義中間件一般用在攔截所有請(qǐng)求之前或者所有請(qǐng)求之后,所有請(qǐng)求之前自定義權(quán)限驗(yàn)證、請(qǐng)求參數(shù)驗(yàn)證等中間件,請(qǐng)求之后一般會(huì)設(shè)置共同響應(yīng)、錯(cuò)誤中間件

43.什么是路由,項(xiàng)目中你是怎么實(shí)現(xiàn)路由的

路由描述是項(xiàng)目中用戶(hù)的請(qǐng)求以及分發(fā)處理的中間件
NodJS基本應(yīng)用中可以通過(guò)選擇結(jié)構(gòu)實(shí)現(xiàn)基本路由操作,Express項(xiàng)目中通過(guò)構(gòu)建的獨(dú)立對(duì)象app或者router實(shí)現(xiàn)了路由分配

44.web應(yīng)用一般都是多個(gè)用戶(hù)同時(shí)訪(fǎng)問(wèn)的,項(xiàng)目中是如何解決多個(gè)用戶(hù)使用的數(shù)據(jù)互相獨(dú)立問(wèn)題的

Web應(yīng)用開(kāi)發(fā)過(guò)程中,主要工作在服務(wù)器上,服務(wù)器和WEB應(yīng)用會(huì)提供各種多用戶(hù)管理模式。如多進(jìn)程模式、多線(xiàn)程模式、單線(xiàn)程事件驅(qū)動(dòng)模式等等
前端使用的NodeJS應(yīng)用中,主要是單線(xiàn)程事件驅(qū)動(dòng)模式實(shí)現(xiàn)多用戶(hù)并發(fā),多個(gè)用戶(hù)的數(shù)據(jù)通過(guò)每個(gè)請(qǐng)求所屬的session會(huì)話(huà)進(jìn)行管理,每個(gè)用戶(hù)的session都是獨(dú)立的一個(gè)數(shù)據(jù)空間,和其他用戶(hù)的session不會(huì)沖突

45.什么是數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)是軟件結(jié)構(gòu)中存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù)組件,主要提供數(shù)據(jù)持久化存儲(chǔ)和操作的服務(wù)

46.MySQL中怎么創(chuàng)建和刪除數(shù)據(jù)庫(kù)

可以通過(guò)界面軟件操作,圖形化界面中創(chuàng)建和刪除數(shù)據(jù)庫(kù)
也可以通過(guò)sql語(yǔ)句的方式創(chuàng)建和刪除數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)
create database 數(shù)據(jù)庫(kù)名稱(chēng) default charset ‘utf8’
刪除數(shù)據(jù)庫(kù)
drop database 數(shù)據(jù)庫(kù)名稱(chēng)

47.MySQL中怎么創(chuàng)建和刪除數(shù)據(jù)表

可以使用圖形化界面的方式創(chuàng)建和刪除數(shù)據(jù)表
也可以使用sql語(yǔ)句創(chuàng)建和刪除數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表
create table 數(shù)據(jù)表名稱(chēng)()
刪除數(shù)據(jù)表
drop table 數(shù)據(jù)表名稱(chēng)

48.假設(shè)MySQL中已經(jīng)存在用戶(hù)表user

id username password nickname phone
1 zhangsan sdaho 張三 12345678910
2 lisi shdah 李四 12345689709

使用sql語(yǔ)句完成下面的業(yè)務(wù)操作
1,注冊(cè)用戶(hù)時(shí),判斷賬號(hào)是否已經(jīng)存在

select * from user where username = '要注冊(cè)的賬號(hào)'

2.會(huì)員zhangsan登錄時(shí),同時(shí)允許使用賬號(hào)或者手機(jī)號(hào)和密碼登錄系統(tǒng)

select * from user where (username = 'zhangsan' or phone='12345678910') and password = 'sdaho'

3.lisi更新用戶(hù)資料時(shí),更新自己新的昵稱(chēng) --莉絲

update user set nickname = '莉絲' where uername = 'lisi'

4.用戶(hù)zhangsan查看自己的資料綁定新的手機(jī)號(hào)碼13523452345

updata user set phone = '13523452345' where usernmae = 'zhangsan'

5.用戶(hù)lisi要銷(xiāo)毀自己的資料,如何注銷(xiāo)自己的用戶(hù)信息

delete from user where username = 'lisi'

49.簡(jiǎn)述GET請(qǐng)求和POST請(qǐng)求的異同

GET請(qǐng)求和POST請(qǐng)求都屬于HTTP1.1規(guī)范中的請(qǐng)求方式,用戶(hù)客戶(hù)端向服務(wù)器發(fā)起請(qǐng)求完成數(shù)據(jù)處理
GET請(qǐng)求主要通過(guò)瀏覽器URL地址、超鏈接、link標(biāo)簽href屬性、script標(biāo)簽src屬性以及img的src屬性等發(fā)起,請(qǐng)求中可以附帶字符串類(lèi)型的參數(shù)數(shù)據(jù),參數(shù)以key=value的形式拼接在url地址后面,主要用于向服務(wù)器請(qǐng)求獲取數(shù)據(jù)
POST請(qǐng)求主要通過(guò)表單或者Ajax進(jìn)行發(fā)送,請(qǐng)求中以附帶任意類(lèi)型的參數(shù)數(shù)據(jù),參數(shù)包含在請(qǐng)求體中進(jìn)行發(fā)送,具有一定的保密性,主要用于向服務(wù)器提交數(shù)據(jù)

50.一個(gè)HTTP請(qǐng)求從發(fā)送到瀏覽器渲染展示期間都發(fā)生了什么事

從HTTP請(qǐng)求發(fā)送到瀏覽器渲染展示頁(yè)面,是一個(gè)完整的請(qǐng)求過(guò)程
首先請(qǐng)求發(fā)送之后,會(huì)被DNS進(jìn)行解析得到域名對(duì)應(yīng)的IP地址
通過(guò)IP地址查詢(xún)到服務(wù)器,向服務(wù)器發(fā)送具體請(qǐng)求,請(qǐng)求具體資源數(shù)據(jù)
服務(wù)器根據(jù)請(qǐng)求路徑完成業(yè)務(wù)處理,將返回的數(shù)據(jù)包裝到響應(yīng)對(duì)象中
響應(yīng)對(duì)象返回給瀏覽器進(jìn)行解析,渲染展示給用戶(hù)

51.簡(jiǎn)述你都用過(guò)哪些NodeJS模塊

NodeJS是一個(gè)JavaScript運(yùn)行時(shí)環(huán)境,包含了大量的具有獨(dú)立功能的模塊
path用于文件路徑處理
fs 用戶(hù)文件系統(tǒng)內(nèi)容讀寫(xiě)
qs 用于查詢(xún)字符串解析
querystring 用于查詢(xún)字符串解析
trim 用于字符串空格剔除
http 用于web服務(wù)支持
express用于web應(yīng)用開(kāi)發(fā)
svg-captcha 用于驗(yàn)證碼操作
serve-favicon用于服務(wù)LOGO處理
formidable用于文件上傳操作
express-session 用于會(huì)話(huà)管理
cookie-parser用于cookie數(shù)據(jù)操作
md5 用于數(shù)據(jù)單向加密

52.什么是中間件,NodeJS中你都用過(guò)哪些類(lèi)型的中間件

中間件是工作在請(qǐng)求和響應(yīng)之間的中間組件,主要用于請(qǐng)求和響應(yīng)的增強(qiáng)
應(yīng)用級(jí)中間件:路由函數(shù),攔截請(qǐng)求,使用對(duì)應(yīng)的函數(shù)進(jìn)行數(shù)據(jù)處理
內(nèi)置中間件:靜態(tài)文件處理、POST參數(shù)處理
第三方中間件:session會(huì)話(huà)管理
前置中間件:自定義中間件,主要用于在所有路由函數(shù)之前進(jìn)行請(qǐng)求/響應(yīng)的處理
錯(cuò)誤中間件:自定義中間件,主要用于所有路由函數(shù)之后進(jìn)行錯(cuò)誤消息處理

53.普通請(qǐng)求和Ajax請(qǐng)求的區(qū)別

普通請(qǐng)求,客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求,如果服務(wù)器返回需要渲染的數(shù)據(jù)會(huì)出現(xiàn)頁(yè)面整體刷新
Ajax請(qǐng)求,客戶(hù)端在發(fā)送某個(gè)事件時(shí)后臺(tái)發(fā)送請(qǐng)求,獲取服務(wù)器返回?cái)?shù)據(jù)后可以執(zhí)行頁(yè)面中的數(shù)據(jù)局部刷新

54.什么是跨域,簡(jiǎn)述都有哪些跨域的實(shí)現(xiàn)方式

跨域是客戶(hù)端和服務(wù)器不在同一個(gè)協(xié)議/域名/端口的情況下,進(jìn)行數(shù)據(jù)請(qǐng)求的操作過(guò)程,一般情況下由于同源策略的存在,服務(wù)器數(shù)據(jù)不允許跨域訪(fǎng)問(wèn)
由于數(shù)據(jù)共享的需求,需要部分需求中支持跨域數(shù)據(jù)請(qǐng)求,跨域的實(shí)現(xiàn)方式主要有如下幾種:
CORS跨域:服務(wù)器端的跨域,服務(wù)器一側(cè)通過(guò)設(shè)置請(qǐng)求頭讓數(shù)據(jù)接口支持跨域
JSONP跨域,客戶(hù)端的跨域,本質(zhì)上通過(guò)script標(biāo)簽的src屬性的特性進(jìn)行跨域
websoket跨域,本質(zhì)上就是客戶(hù)端和服務(wù)器之間的長(zhǎng)連接,支持跨域的請(qǐng)求
其他的跨域,可以通過(guò)iframe標(biāo)簽的特性,完成跨域的操作,或者通過(guò)中間件跨域的方式完成跨域請(qǐng)求,如跨域中間件cors,如nginx代理跨域等

55.說(shuō)一下jsonp跨域的原理,jQuery中怎么實(shí)現(xiàn)jsopn跨域的

jsonp跨域底層是通過(guò)sscript的src屬性,實(shí)現(xiàn)跨域請(qǐng)求的是數(shù)據(jù)獲取,獲取的數(shù)據(jù)會(huì)通過(guò)請(qǐng)求后的回調(diào)函數(shù)進(jìn)行獲取和解析處理
jQuer中封裝了了jsonp的跨域請(qǐng)求,可以直接通過(guò)data'Type選項(xiàng)指定jsonp跨域

$.ajax({
    url:xxx,
    type:'get',
    data:{參數(shù)},
    dataType: 'jsonp',
    success:function(res) {...}
})

56.什么是代碼的review操作?一般由誰(shuí)進(jìn)行代碼的review?怎么進(jìn)行review?

代碼的review操作,主要包含代碼評(píng)審工作和代碼復(fù)盤(pán)工作
一般都是由小組組長(zhǎng)或者帶自己的同事主導(dǎo)執(zhí)行的,平時(shí)開(kāi)發(fā)項(xiàng)目過(guò)程中自己也可以執(zhí)行代碼的單元review操作
review的操作區(qū)分為通過(guò)軟件工具的自動(dòng)執(zhí)行操作和人工操作的兩部分,軟件工具的自動(dòng)化操作主要是通用性審核,人工操作部分主要是項(xiàng)目定制化規(guī)范和流程審核以及代碼復(fù)盤(pán)

57.Promise有幾種狀態(tài),什么時(shí)候會(huì)執(zhí)行catch代碼塊

Promise執(zhí)行過(guò)程中有三種狀態(tài),分別是pending、fulfilled、rejected狀態(tài),當(dāng)出現(xiàn)rejected狀態(tài)時(shí)就會(huì)執(zhí)行catch代碼塊

58什么是錯(cuò)誤優(yōu)先的回調(diào)函數(shù),為什么要做錯(cuò)誤優(yōu)先的處理

操作的回調(diào)函數(shù)包含很多參數(shù),第一個(gè)參數(shù)是錯(cuò)誤信息的回調(diào)函數(shù)
所有函數(shù)的執(zhí)行,不論是正確結(jié)果還是錯(cuò)誤結(jié)果,都是函數(shù)的返回結(jié)果,錯(cuò)誤優(yōu)先的處理能讓函數(shù)中的執(zhí)行流程第一時(shí)間處理錯(cuò)誤信息,優(yōu)化執(zhí)行流程提高執(zhí)行效率

59.為什么團(tuán)隊(duì)開(kāi)發(fā)需要保障一致的編碼風(fēng)格,哪些工具可以實(shí)現(xiàn)該功能

提高代碼風(fēng)格的統(tǒng)一性,便于多人協(xié)同開(kāi)發(fā)和后期維護(hù)
一般情況下代碼質(zhì)量檢查工具都可以實(shí)現(xiàn)該功能,如前端開(kāi)發(fā)中經(jīng)常會(huì)遇到一些代碼質(zhì)量檢查插件的操作,如JSLint、
ESLinst等

60.什么是stub,什么時(shí)候使用stub

stub模式,主要適用于代碼測(cè)試環(huán)境中的依賴(lài)模擬操作
開(kāi)發(fā)人員進(jìn)行單元測(cè)試或者測(cè)試人員進(jìn)行集成測(cè)試時(shí),如果需要頻繁依賴(lài)其他的運(yùn)行環(huán)境或者運(yùn)行依賴(lài),但是不能確保這些運(yùn)行環(huán)境和運(yùn)行依賴(lài)已經(jīng)準(zhǔn)備充分的情況下,可以使用stub方式進(jìn)行環(huán)境和依賴(lài)的模擬,達(dá)到測(cè)試解耦合的目的
如單元測(cè)試文件讀寫(xiě)方式,但是為了保障目標(biāo)文件不被數(shù)據(jù)污染,不能真實(shí)的發(fā)生文件讀寫(xiě)操作,此時(shí)就可以借助stub方式模擬文件讀寫(xiě)操作完成代碼的測(cè)試工作

61.為什么說(shuō)HTTP協(xié)議是無(wú)狀態(tài)協(xié)議,無(wú)狀態(tài)協(xié)議的優(yōu)缺點(diǎn)是什么,如何解決這樣的無(wú)狀態(tài)問(wèn)題

HTTP協(xié)議在進(jìn)行客戶(hù)端和服務(wù)端的訪(fǎng)問(wèn)過(guò)程中,每次執(zhí)行的請(qǐng)求一旦得到響應(yīng)數(shù)據(jù),客戶(hù)端和服務(wù)端之間的連接就會(huì)斷開(kāi),所以連接狀態(tài)無(wú)法保持,所以將HTTP協(xié)議稱(chēng)為無(wú)狀態(tài)協(xié)議,HTTP無(wú)狀態(tài)協(xié)議的優(yōu)點(diǎn)是連接得到響應(yīng)后直接斷開(kāi),服務(wù)端可以使用這個(gè)斷開(kāi)的空閑連接去接入其他的客戶(hù)端,在一定程度上服務(wù)器可以接入更多的客戶(hù)端連接;缺點(diǎn)是連接狀態(tài)無(wú)法保持就會(huì)導(dǎo)致每次連接都需要進(jìn)行狀態(tài)身份驗(yàn)證,更多的消耗了資源,要解決無(wú)狀態(tài)的操作方式有很多種,可以通過(guò)會(huì)話(huà)跟蹤的方式進(jìn)行狀態(tài)保持

62.什么是Websocket協(xié)議,它的主要應(yīng)用場(chǎng)景是什么

websocket協(xié)議是一種基于TCP協(xié)議的保持長(zhǎng)連接的數(shù)據(jù)交互協(xié)議
主要用于客戶(hù)端和服務(wù)端需要進(jìn)行雙向消息推送的場(chǎng)景,如客服應(yīng)用、消息推送等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、什么是同步?什么是異步?項(xiàng)目中你是怎么用的呢? 同步是多個(gè)任務(wù)按照?qǐng)?zhí)行順序進(jìn)行執(zhí)行,前面的任務(wù)執(zhí)行完成后才能開(kāi)...
    大牧莫邪閱讀 444評(píng)論 0 1
  • 廢話(huà)少說(shuō),本文分四個(gè)部分,css、js、知識(shí)點(diǎn)一、知識(shí)點(diǎn)二、React(部分問(wèn)題沒(méi)有給出答案,后續(xù)更新) css面...
    666同學(xué)閱讀 1,178評(píng)論 0 0
  • 一、Web端 https://www.nowcoder.com/discuss/588372 1.float如何清...
    陳一季閱讀 4,740評(píng)論 2 18
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,758評(píng)論 0 5
  • 1、移動(dòng)端你遇到過(guò)什么兼容問(wèn)題? 1、如果在input設(shè)置邊框顏色在ios系統(tǒng)里會(huì)出現(xiàn)兼容性問(wèn)題,需要在外面加一個(gè)...
    青青菜鳥(niǎo)閱讀 4,506評(píng)論 0 28

友情鏈接更多精彩內(nèi)容