2017-05-24 95 views
0

對不起,如果這是非常明顯的!我在試圖瞭解node.js如何響應來自瀏覽器的請求方面遇到困難。我已經瀏覽了互聯網上的教程,其中express.js用於使用node.js構建剩餘的服務器端代碼。現在除了建立起承諾的路線之外。所以很顯然,只有在承諾解決時纔會回覆回覆。因此,流量爲 -node.js如何同步返回對REST Web服務的響應?

//一號線

瀏覽器 - > REST服務

//二號線

REST服務 - >找到路徑 - >打服務 - > GET數據 - >發送數據返回給瀏覽器

上第二行的整個過程是在異步模式。那麼是否會有一個線程掛在服務器端,瀏覽器會等待node.js啓用的REST服務返回響應?如果情況並非如此,那麼瀏覽器或者像POSTMAN這樣的REST客戶端如何實時地知道響應。

編輯:

我已刪除的外部鏈接,因爲它是製造混亂。

+1

「所以會有一個線程掛在服務器端」 - 爲什麼會有?如你所說,它使用承諾。 「 – Quentin

+1

」瀏覽器將等待node.js啓用REST服務來返回響應「 - HTTP客戶端*總是*必須等待響應。網絡需要時間。這裏沒什麼特別的。 – Quentin

+0

如果他們必須等待響應,那麼服務器端的某個線程也會打開,對吧?否則,你將如何返回迴應? – user3276247

回答

3

的NodeJS不使用網絡請求的線程。它使用內置於操作系統中的網絡異步支持。因此,nodejs中的未決網絡請求不會爲每個請求維護一個打開的線程。它將有一個開放的插座。 nodejs進程將在該套接字上有數據掛起時通知。

同樣,承諾不會導致線程處於打開狀態。承諾僅僅是一種通知方案,當異步操作完成時,基礎異步操作將解析或拒絕,然後承諾可以通知已註冊處理程序的代碼。

在你所提供的鏈接,也不清楚你指的到底是哪代碼。如果你想詢問一些特定的代碼,那麼請將代碼直接粘貼到你的問題中,以便明確並遵循堆棧溢出關於代碼的指導原則,你所詢問的代碼不僅僅存在於外部鏈接中。

上第二行的整個過程是在異步模式。那麼是否會有一個線程掛在服務器端,瀏覽器會等待node.js啓用的REST服務返回響應?

目前尚不清楚你所說的「二線」的意思。您提供的鏈接中有很多代碼。 nodejs內部的網絡請求不會使用每個請求的線程。它們保留一個開放的TCP套接字,但是在操作系統中爲套接字使用底層異步通知支持,而不是本地線程。

如果情況並非如此,那麼瀏覽器或者像POSTMAN這樣的REST客戶端如何實時瞭解響應。

POSTMAN或REST客戶端在服務器上有TCP連接(使用該TCP連接上的HTTP協議)。他們創建TCP連接,然後在該套接字上發送HTTP請求,並且該套接字在等待響應時保持打開狀態。當服務器完成其業務時,它通過打開的TCP套接字發回響應。有很多不同的方式可以編寫客戶端代碼(POSTMAN和瀏覽器可能會以不同的方式編寫客戶代碼),但是當數據到達TCP套接字時,客戶端會以某種方式通知有數據要讀取,客戶端將讀取數據,處理響應,然後由於這是一個HTTP請求/響應協議,TCP連接可能會關閉。

+0

外部鏈接只是爲了illsutrate流量=> REST服務 - >找到路徑 - >打服務 - >獲取數據 - >將數據返回給瀏覽器 我不是指任何特定的代碼段。 – user3276247

+0

我也註釋了第二行。反正你的答案解決了我的查詢。我會接受它。感謝這樣的詳細回覆。 – user3276247