Node.js Up and Runing 学习日记(三)


基本例子实现

Step01 安装Express

    npm install express

使用Express的基本Web服务器

    var express = require('express') 
    var app = express.createServer()
    app.get('/',function(req, res) {
        res.send('Welcome to the pageHome')
    }).listen(8000)    

please come to my Home

思路讲解

  • 我们引入express模块,它会在后台调用http模块,Node会自动解析依赖关系
  • 调用 Server() 来创建服务器, listen() 监听指定端口

    不需要用Express为请求事件指定监听器,而是通过HTTP匹配的方式来调用对应的方法

  • 调用get()方法为匹配的第一个参数所指定的URLGET请求指定了回调函数

    根据HTTP请求的不同方法进行过滤,根据特定的URL进行过滤

  • 采用http模块的时候,我们需要创建HTTP头,并且在发送内容之前把HTTP先发送给客户端,在Express中我们调用res.send()方法实现发送HTTP头和同时调用end方法的功能.
  • 到目前为止,这个新的服务器只相应URL为"/"的GET请求

    添加基础API

        var express = require('express')
        var app = express.Server()
        app.listen(9000)

        var tweets = []
        app.get('/',function(req, res){
        res.send('Welcome to Node Twitter')
        })
        app.post('/send',express.bodyParser(), function(req, res){
        if (req.body && req.body.tweet) {
        tweets.push(req.body.tweet)
        res.send({status:"ok",message:'tweet recevied'})
        } else {
        res.send({status:"ok",message:'tweet recevied'})
        }
        })

        app.get('/tweets', function(req, res){
        res.send(tweets)
        })
  1. 首先把绑定监听端口的事件放在前头,这不会导致下面的响应请求的函数出现问题,有两点原因
    • javascript所有的事件触发都在事件循环中,这意味着我们除非完成了这次循环中的所有处理函数,否则新的事件是不会被触发调用的,对于这个例子而言,除非我们把所有初始化代码执行它,否则不会调用request事件
    • app.listen()的调用是异步的,因为绑定TCP端口也需要花费时间,而其他处理事件监听器则是同步的
  2. post()中,跟在URL后面的参数是一个中间件

    中间件: 一小段特定的代码,位于原始请求事件与我们给指定的路由之间,对一些通用功能进行代码重用

  3. express.bodyParser()req对象添加了新的属性,即req.body,包含了POST数据对应的对象express.bodyParser()中间件只能够处理POST方法的数据,而且要求HTTP头的Content-Type属性是application/x-www-form-urlencoded或者json,这两种格式很容易解析成key/value值,并保存req.body对象中

  4. 判定是否找到数据,如果存在,再查找tweet,找到了就存放到数组中,并且返回一个JSON字符串表示成功,反之返回表示失败的JSON

var http = require('http'),
    assert = require('assert')

var opts = {
    host: 'localhost',
    port: 8000,
    path:'/send',
    method: 'POST',
    headers: {'Content-Type':'application/x-www-form-urlencoded'}
}

var req = http.request(opts, function(res){
    res.setEncoding('utf8')

    var data = ""
    res.on('data', function(d){
        data += d
    })

    res.on('end',function(){
        assert.strictEqual(data,'{status:"ok",message:"tweet recevied"}')
    })
})
 req.write('tweet-test')
 req.end()
  • 发送HTTP请求,然后用assert模块对返回值进行测试.
  • http.request()创建新的http请求对象,并指定opts参数,我们已经为opts配置了一系列属性,返回对象只会出现一次
  • 处理返回信息:
    1. 指定编码方式
    2. 定义一个data变量,流式方式来处理服务器的所有响应数据,在Express服务器中, 用express.bodyDecoder来处理数据流中所有的内容,但是在这里我们需要手动处理:
      • 指定响应返回时的data事件监听函数,追加到data变量上即可
    3. 同时我们监听响应的end事件,以便在所有数据到达后采取行动:实现一边接收数据一边处理,而不需要等待完成
    4. assert.strictEqual会对返回的数据和我们预期发送内容的一致性检查"==="
    5. 最后向服务器发送数据,end()表示数据已经发送完毕
优质内容筛选与推荐>>
1、zabbix 监控项(key)
2、05、spring
3、Python 进阶 之 map()函数
4、MYSQL日期 字符串 时间戳互转
5、Swift 代理


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号