18.4.25Node初始

https://www.nodebeginner.org/index-zh-cn.html  Node入门:

var http = require("http");
function onRequest(request, response) {  
        console.log("Request received.");  
        response.writeHead(200, {"Content-Type": "text/plain"});  
        response.write("Hello World");  
        response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
注意:在  onRequest (我们的回调函数)触发的地方,我用  console.log 输出了一段文本。在HTTP服务器开始工作 之后,也输出一段文本。  当我们与往常一样,运行它 node server.js时,它会马上在命令行上输出“Server has started.”。当我们向服务器发出请求(在浏览器访问 http://localhost:8888/),“Request received.”这条消息就会在命令行中出现。
这就是事件驱动的异步服务器端JavaScript和它的回调啦!(请注意,当我们在服务器访问网页时,我们的服务器可能会输出两次“Request received.”。那是因为大部分浏览器都会在你访问 http://localhost:8888/ 时尝试读取 http://localhost:8888/favicon.ico )

当回调启动,我们的  onRequest() 函数被触发的时候,有两个参数被传入:  request 和  response   它们是对象,你可以使用它们的方法来处理HTTP请求的细节,并且响应请求(比如向发出请求的浏览器发回一些东西)
所以我们的代码就是:当收到请求时,使用  response.writeHead() 函数发送一个HTTP状态200和HTTP头的内容类型(content-type),使用  response.write() 函数在HTTP相应主体中发送文本“Hello World"。最后,我们调用  response.end() 完成响应。目前来说,我们对请求的细节并不在意,所以我们没有使用  request 对象。

服务端的模块放在哪里?
我们现在就来谈谈怎么把server.js变成一个真正的Node.js模块,使它可以被我们(还没动工)的  index.js 主文件使用。
Node.js中自带了一个叫做“http”的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量  var http = require("http");  .....  http.createServer(...);
把某段代码变成模块意味着我们需要把我们希望提供其功能的部分  导出 到请求这个模块的脚本
目前,我们的HTTP服务器需要导出的功能非常简单,因为请求服务器模块的脚本仅仅是需要启动服务器而已。


我们把我们的服务器脚本放到一个叫做  start 的函数里,然后我们会导出这个函数。
var http = require("http");
function start() {
  function onRequest(request, response) {
    console.log("Request received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }
 http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
exports.start = start;
这样,我们现在就可以创建我们的主文件  index.js 并在其中启动我们的HTTP了,虽然服务器的代码还在  server.js 中。
index.js:
var server = require("./server");
server.start();
正如你所看到的,我们可以像使用任何其他的内置模块一样使用server模块:请求这个文件并把它指向一个变量,其中已导出的函数就可以被我们使用了
我们现在可以把我们的应用的不同部分放入不同的文件里,并且通过生成模块的方式把它们连接到一起了。


处理不同的HTTP请求在我们的代码中是一个不同的部分,叫做“路由选择”——那么,我们接下来就创造一个叫做  路由 的模块吧。
我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码(这里“代码”对应整个应用的第三部分:一系列在接收到请求时真正工作的处理程序)。
我们需要的所有数据都会包含在request对象中,该对象作为 onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.JS模块,它们分别是 urlquerystring模块。


现在我们来给 onRequest()函数加上一些逻辑,用来找出浏览器请求的URL路径:

为了使整个过程非阻塞,Node.js会将POST数据拆分成很多小的数据块,然后通过触发特定的事件,将这些小数据块传递给回调函数。这里的特定的事件有data事件(表示新的小数据块到达了)以及end事件(表示所有的数据都已经接收完毕)。

我们需要告诉Node.js当这些事件触发的时候,回调哪些函数。怎么告诉呢? 我们通过在request对象上注册监听器(listener) 来实现。这里的request对象是每次接收到HTTP请求时候,都会把该对象传递给onRequest回调函数。

如下所示:

request.addListener("data", function(chunk) {   // called when a new chunk of data was received }); request.addListener("end", function() {   // called when all chunks of data have been received });

在我看来,获取所有来自请求的数据,然后将这些数据给应用层处理,应该是HTTP服务器要做的事情。因此,我建议,我们直接在服务器中处理POST数据,然后将最终的数据传递给请求路由和请求处理器,让他们来进行进一步的处理。

因此,实现思路就是: 将dataend事件的回调函数直接放在服务器中,在data事件回调中收集所有的POST数据,当接收到所有数据,触发end事件后,其回调函数调用请求路由,并将数据传递给它,然后,请求路由再将该数据传递给请求处理程序。





猜你喜欢

转载自blog.csdn.net/wangqingqing_/article/details/80547906