• 用Node开启你的第一个POST请求
  • 发布于 1周前
  • 41 热度
    0 评论
这里不是从0到1 的开始,希望你能懂一些相关的基本的知识。

先看demo 的目录

文件目录安排,是我将有些内容按照各自的功能先后出来的抽出来。全部写在一起很乱,读者在实践的时候,也可以根据各自的习惯拆分,也可以合并。

第一步:
cd lesson7 => npm inint 根据习惯输入相关信息

第二步:index.js
/**
 * 发送post 请求
 * 来源:www.dalbll.com
 */
var server = require('./server.js')
var router = require('../router.js')
var requestHandlers = require('./requestHandler.js')
console.log(router)
var handle = {}
handle['/'] = requestHandlers.start
handle['/start'] = requestHandlers.start
handle['/upload'] = requestHandlers.upload
server.start(router.route, handle)

我们希望根据路由(router)跳转到不同的页面,然后处理不同的处理逻辑。

目光注视到 server.start 这个函数。

第二步:server.js
/**
 * 1.首先设置接受编码的风格UTF-8
 * 2.注册 data 事件的监听,用于手机每次的数据块,并将其赋值给postData 变量
 * 3.注册 end 事件监听,确保它只会接受完毕后触发,并且只触发依稀,我们同时还把POST数据传递给路由处理,因为请求数据,
 */
var http = require('http')
var url = require('url')

function start(route, handle) {
  function onRequest(request, response) {
    var pathName = url.parse(request.url).pathname
    var postData = ''
    console.log('Request for ' + pathName + 'received.')

    request.setEncoding('utf8')
    request.addListener('data', function(postDataChunk) {
      postData += postDataChunk
      console.log('Received POST data chunk' + postDataChunk)
    })
    request.addListener('end', function() {
      route(handle, pathName, response, postData)
    })
  }
  http.createServer(onRequest).listen(8888)
  console.log('Server has started.')
}

exports.start = start
注意:这里onRequest 抽出单独做函数处理的。

目光注意到:route 函数,是刚才index.js  传入的
function route(handle, pathname, response, request) {
  console.log('about to route a request for ' + pathname)
  if (typeof handle[pathname] === 'function') {
    return handle[pathname](response, request)
  } else {
    console.log('No request handler found for ' + pathname)
    response.writeHead(400, { 'Content-Type': 'text/plain' })
    response.write('404 Not found')
    response.end()
  }
}
exports.route = route
这里把404 放在这边统一出来了,因为在输入地址的时候,都会到这里做匹配,因此很方便在这里做统一处理。
handler =>requestHandler()

第四步:requestHandler.js 不同的处理结果。
var querystring = require('querystring')
function start(response, postData) {
  console.log("Request handler 'start' was called.")
  var body =
    '<html>' +
    '<head>' +
    '<meta http-equiv="Content-Type" content="text/html; ' +
    'charset=UTF-8" />' +
    '</head>' +
    '<body>' +
    '<form action="/upload" method="post">' +
    '<textarea name="text" rows="20" cols="60"></textarea>' +
    '<input type="submit" value="Submit text" />' +
    '</form>' +
    '</body>' +
    '</html>'
  response.writeHead(200, { 'Content-Type': 'text/html' })
  response.write(body)
  response.end()
}
/**
 *
 * 提交表单来处理post请求问题
 * 采用异步非阻塞的处理POST请求数据
 *
 * 为了使整个过程非阻塞,Node.js 回见post的数据拆分成很小的数据模块,
 * 然后通过触发特定的事件,将这些小数据块传递给回调函数,这里特定的时间有data事件(表示小数据块到达)
 * 以及end事件(表示所有的数据已经接受完毕)
 *
 * 需要告诉Node.js 当这些事情触发的时候,回调哪些函数。
 * 通过在request 对象注册监听器来实现,
 */
function upload(response, postData) {
  console.log("Request handler 'upload' was called.")
  response.writeHead(200, { 'Content-Type': 'text/html' })
  response.write("You've sent the text: " + querystring.parse(postData).text)
  response.end()
}
exports.start = start
exports.upload = upload
然后 开始node index.js  跑起来试试看吧~~~
用户评论
可能感兴趣的话题