簡體   English   中英

如何從NodeJS服務器向客戶端發送信息?

[英]How can I send information from NodeJS server to client side?

例如,我想向客戶端發出信號,通過POST方法以HTML格式發送的用戶名已存在於我的數據庫中。

我知道如何使用body-parser恢復POST數據,我知道如何在MySQL數據庫中查找它。

我知道我可以使用Ajax直接在表單上編寫錯誤消息。 我的NodeJS服務器需要發送什么以及它如何發送這些信息?

我搜索了大量的教程,我剛剛找到了他們發送新HTML頁面的解決方案。 我想保持我的網頁相同,並使用appendChild()等函數發布錯誤消息。

有幾種方法你可以從服務器端發送數據,所以NodeJS,到客戶端 - 我假設在你的情況下將是一些JavaScript文件,如main.js處理DOM模擬。

因此,您可以發送數據的一種方式是通過像Handlebars這樣的模板引擎 有一個易於使用的快遞模塊,你可以到這里: hbs

現在快速總結一下這樣的引擎是如何工作的,我們基本上就像你在教程中看到的那樣發送一個HTML文件, 然而 ,像Handlebars這樣的模板引擎允許我們動態地發送帶有該文件的實際數據,所以我們要做的是呈現一個特定的Handlebars 模板 (核心只是HTML),並將JavaScript對象傳遞給render調用,該調用將包含要傳遞到該文件的所有數據,然后在.hbs文件中訪問它。

所以在服務器端,我們會寫這樣的東西,假設我們有一個名為home.hbs的文件,並設置Handlebars作為模板引擎:

router.get('/home', function(req,res) {
   var dataToSendObj = {'title': 'Your Website Title', 'message': 'Hello'};
   res.render('home',dataToSendObj);
});

並在home.hbs訪問如下:

<html>
   <header>
      {{title}}
   </header>
   <body>
      message from server: {{message}}
   </body>
</html>

現在,這種方法的問題在於,如果您想動態更新頁面上的數據, 不必重新加載頁面,那么使用模板引擎並不理想。 相反,就像你說的那樣,你會使用AJAX。

所以,你可以從你的服務器的NodeJS到您的網站的前端發送數據的第2個方法,是使用異步AJAX調用。

首先,添加一個路由到您用於AJAX進行調用的任何路由處理程序。 這有一些邏輯可能訪問數據庫,進行一些檢查並將一些有用的信息返回給客戶端。

router.get('/path/for/ajax/call', function(req,res) {
   // make some calls to database, fetch some data, information, check state, etc...
   var dataToSendToClient = {'message': 'error message from server'};
   // convert whatever we want to send (preferably should be an object) to JSON
   var JSONdata = JSON.stringify(dataToSendToClient);
   res.send(JSONdata);
});

假設您有一些文件,例如main.js ,請使用回調創建一個AJAX請求來偵聽某些事件響應,如下所示:

var req = new XMLHttpRequest();
var url = '/path/for/ajax/call';

req.open('GET',url,true); // set this to POST if you would like
req.addEventListener('load',onLoad);
req.addEventListener('error',onError);

req.send();

function onLoad() {
   var response = this.responseText;
   var parsedResponse = JSON.parse(response);

   // access your data newly received data here and update your DOM with appendChild(), findElementById(), etc...
   var messageToDisplay = parsedResponse['message'];

   // append child (with text value of messageToDisplay for instance) here or do some more stuff
}

function onError() {
  // handle error here, print message perhaps
  console.log('error receiving async AJAX call');
}

總結一下使用AJAX的上述方法,這將是交互的流程:

  • 在客戶端觸發操作(如按下按鈕)
  • 它的事件處理程序創建一個新的AJAX請求,設置回調,以便它知道當響應從服務器返回時該怎么做,並發送請求
  • 發送的GET或POST請求由服務器上的路由處理程序捕獲
  • 執行服務器端邏輯以從數據庫,狀態等獲取數據...
  • 獲取新數據,將其放入JSON對象,然后由服務器發回
  • 客戶端AJAX的加載錯誤事件監聽器捕獲響應並執行回調
  • 在成功響應加載的情況下,我們解析響應,並更新客戶端UI

希望這有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM