如何从NodeJS服务器向客户端发送信息?

Ste*_*n N 5 node.js express

例如,我想向客户端发出信号,通过POST方法以HTML格式发送的用户名已存在于我的数据库中.

我知道如何使用body-parser恢复POST数据,我知道如何在MySQL数据库中查找它.

我知道我可以使用Ajax直接在表单上编写错误消息.我的NodeJS服务器需要发送什么以及它如何发送这些信息?

我搜索了大量的教程,我刚刚找到了他们发送新HTML页面的解决方案.我想保持我的网页相同,并使用appendChild()等函数发布错误消息.

小智 9

有几种方法你可以从服务器端发送数据,所以NodeJS,到客户端 - 我假设在你的情况下将是一些像main.js处理DOM模拟的JavaScript文件.

因此,您可以发送数据的一种方式是通过像Handlebars这样的模板引擎.有一个易于使用的快递模块,你可以到这里:hbs.

现在快速总结一下这样的引擎是如何工作的,我们基本上就像你在教程中看到的那样发送一个HTML文件,然而,像Handlebars这样的模板引擎允许我们动态地发送带有该文件的实际数据,所以我们要做的是渲染一个特定的Handlebars 模板(核心只是HTML),并将JavaScript对象传递给渲染调用,该调用将包含您要传递到该文件的所有数据,然后在.hbs文件中访问它.

所以在服务器端,我们会写这样的东西,假设我们有一个文件调用home.hbs并设置Handlebars作为模板引擎:

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

home.hbs像这样访问:

<html>
   <header>
      {{title}}
   </header>
   <body>
      message from server: {{message}}
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

现在,这种方法的问题在于,如果您想动态更新页面上的数据,不必重新加载页面,那么使用模板引擎并不理想.相反,就像你说的那样,你会使用AJAX.

因此,第二你可以从你的服务器的NodeJS到您的网站的前端发送数据的方式,是使用异步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);
});
Run Code Online (Sandbox Code Playgroud)

假设您有一些文件,例如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');
}
Run Code Online (Sandbox Code Playgroud)

总结一下使用AJAX的上述方法,这将是交互的流程:

  • 在客户端触发操作(如按下按钮)
  • 它的事件处理程序创建一个新的AJAX请求,设置回调,以便它知道当响应从服务器返回时该怎么做,并发送请求
  • 发送的GET或POST请求由服务器上的路由处理程序捕获
  • 执行服务器端逻辑以从数据库,状态等获取数据...
  • 获取新数据,将其放入JSON对象,然后由服务器发回
  • 客户端AJAX的加载错误事件监听器捕获响应并执行回调
  • 在成功响应加载的情况下,我们解析响应,并更新客户端UI

希望这有用!