zoukankan      html  css  js  c++  java
  • node.js

    第一个应用 Hello world
     
    新建一个 111.js文件
    在命令行中 输入 node 111.js
     
    稍微复杂的应用,技术要求:
     
    - 用户可以通过浏览器使用我们的应用。
     
    - 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单。
     
    - 用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/upload,该页面完成上传后会把图片显示在页面上。
     
    应用不同的模块分析
     
    - 我们需要提供Web页面,因此需要一个HTTP服务器
     
    - 对于不同的请求,根据请求的URL,我们的服务器需要给予不同的响应,因此我们需要一个路由,用于把请求对应到请求处理程序(request handler)
     
    - 当请求被服务器接收并通过路由传递之后,需要可以对其进行处理,因此我们需要最终的请求处理程序
     
    - 路由还应该能处理POST数据,并且把数据封装成更友好的格式传递给请求处理入程序,因此需要请求数据处理功能
     
    - 我们不仅仅要处理URL对应的请求,还要把内容显示出来,这意味着我们需要一些视图逻辑供请求处理程序使用,以便将内容发送给用户的浏览器
     
    - 最后,用户需要上传图片,所以我们需要上传处理功能来处理这方面的细节
     
    使用Node.js时,我们不仅仅在实现一个应用,同时还实现了整个HTTP服务器。事实上,我们的Web应用以及对应的Web服务器基本上是一样的。
     
    构建应用的模块
     
    一个基础的HTTP服务器
     
     
    //服务器模块
    //请求(require) Node.js 自带的http模块,并且把赋值给http变量
    var http = require('http');
     
    // 调用http模块提供的函数: createServer,
    // 这个函数会返回一个对象,对象有一个listen 的方法,这个方法有一个参数,制定HTTP 服务器监听的端口号
    http.createServer(function(request, response) {
        response.writeHead(200, {
            "Content-Type": "text/plain"
        });
        response.write('Hello world');
        response.end();
    }).listen(8888)
     
    // 基于事件驱动的回调
    // 不过这是Node.js原生的工作方式。它是事件驱动的,这也是它为什么这么快的原因
     
    当我们使用http.createServer方法的时候,我们当然不只是想要一个侦听某个端口的服务器,我们还想要它在服务器收到一个HTTP请求的时候做点什么。这是异步的:请求任何时候都可能到达,但是我们的服务器却跑在一个单进程中。
     
    解决方法
     
    php中
     
    写PHP应用的时候,我们一点也不为此担心:任何时候当有请求进入的时候,网页服务器(通常是Apache)就为这一请求新建一个进程,并且开始从头到尾执行相应的PHP脚本。
     
    在node.js中
     
    在我们的Node.js程序中,当一个新的请求到达8888端口的时候,我们怎么控制流程呢?
    Node.js/JavaScript的事件驱动设计能够真正帮上忙的地方了
     
    我们创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。  我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了
     
    这个就是我们所谓的  -----  回调函数
     
    我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。
     
     
    我们怎么证明,在创建完服务器之后,即使没有HTTP请求进来、我们的回调函数也没有被调用的情况下,我们的代码还继续有效呢?我们试试这个:
     
    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() 的主体部分
    当回调启动,我们的 onRequest() 函数被触发的时候,有两个参数被传入: request 和 response 。
     
     
    它们是对象,你可以使用它们的方法来处理HTTP请求的细节,并且响应请求(比如向发出请求的浏览器发回一些东西)。
    所以我们的代码就是:当收到请求时,使用 response.writeHead()函数发送一个HTTP状态200和HTTP头的内容类型(content-type),使用 response.write() 函数在HTTP相应主体中发送文本“Hello World"。
    最后,我们调用 response.end() 完成响应。
     
    服务端的模块放在哪里
     
    模块化 的
     
    index.js
    var server = require("./server");
     
    server.start() 
     
    在server.js中
    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;
     
     
     
     
  • 相关阅读:
    swift语言点评十三-Lazy
    swift语言点评十二-Subscripts
    swift语言点评十一-Methods
    命题和判断有什么区别和联系
    形式逻辑三大基本要素-推理的本质
    逻辑的本质是结构和联系的可推理性
    swift语言点评十-Value and Reference Types
    swift语言点评九-类与结构
    swift语言点评八-枚举
    阅读与带宽
  • 原文地址:https://www.cnblogs.com/wy1935/p/7092885.html
Copyright © 2011-2022 走看看