node之旅day3

nodejs

Posted by Kinsomy on June 11, 2018

Node Http 底层api

下图是Node Web陈程序的内部结构,核心是底层api。

node的http请求会返回request 和response的回调函数,服务器没收到一个新的请求,都会用新的req和res对象触发回调函数,node会解析htt头并放到req中返回,但是默认不会解析body。

需要收到调用res.end()去结束响应,否则会超时或一直处于打开状态。

修改http header

  1. res.setHeader(field,value)
  2. res.getHeader(field)
  3. res.removeHeader(field)

设置http code

res.statusCode = 200/404 ….

todo list demo

var http = require('http');
var url = require('url');
var items = [];
var server = http.createServer(function (req, res) {
    console.log(req.method);
    switch (req.method) {
        case 'POST':
            var item = '';
            req.setEncoding('utf8');
            req.on('data', function (chunk) {
                item += chunk;
            });
            req.on('end', function () {
                items.push(item);
                res.end('ok \n');
            })
            break;
        case 'GET':
            // items.forEach(function (item, i) {
            //     res.write(i + ')' + item + '\n');
            // });
            // res.end();
            //优化方案
            var body = items.map(function (item, i) {
                return i + ')' + item;
            }).join('\n');
            res.setHeader('Content-Length', Buffer.byteLength(body));
            res.setHeader('Content-Type', 'text/plain;charset="utf-8"');
            break;
        case 'DELETE':
            var path = url.parse(req.url).pathname;
            var i = parseInt(path.slice(1), 10);
            if (isNaN(i)) {
                res.statusCode = 400;
                res.end('Invalid item id');
            } else if (!items[i]) {
                res.statusCode = 404;
                res.end('item not found');
            } else {
                items.splice(i, 1);
                res.end('delete done');
            }
            break;
    }
});

server.listen(3000);

项目地址:https://github.com/KinsomyJS/Node-Journey