Node.js 实战 (第二部分)

4. 构建Node Web程序

1.HTTP服务器的基本知识

呈现一个HTTP请求

var http = require("http");

var server = http.createServer(function(req, res) {
  // 读取请求头 以及 设置响应头
  var body = "cool!";
  res.setHeader("Content-Length", body.length);
  res.setHeader("Content-Type", "text/plain");

  // 设置状态码
  res.statusCode = 302;
  // 处理请求
  // res.write(body)
  // res.end();

  res.end(body);
});

server.listen(3000);
  • 添加和移除响应头的顺序可以随意,但一定要在调用res.write()或 res.end()之前。
  • 在响应主体的第一部分写入之后,Node会刷新已经设定好的HTTP头。

2. 构建RESTful Web服务

1. 用POST请求创建资源

var http = require("http");

var server = http.createServer(function(req, res) {

  // 设置utf8后, 下面data就会给出字符串,而不是对象
  req.setEncoding('utf8')

  // 读取请求头 以及 设置响应头
  req.on("data", function(chunk) {
    console.log("parsed" + chunk);
  });
  req.on("end", function() {
    console.log("done parsing");
    res.end();
  });
});

server.listen(3000);

5. 存储Node程序中的数据

1. 无服务的数据存储

  • 内存存储
    • 弊端: 不能持久化
  • 基于文件的存储
    • 弊端: 单文件并发有问题.

2. 关系型数据库管理系统

关系型数据库,查询起来很容易, 开源软件也可以不花钱

  • MySQL
    • node-mysql 模块(https://github.com/felixge/node-mysql)
    • npm install mysql
  • PostgreSQL
    • 轻量目录访问协议
    • 通过安全服务应用程序接口
    • 同步复制: 在每次数据操作后对复制进行验证,从而防止数据丢失
    • npm install pg

3. NoSQL数据库

含义是 No SQL 或者 Not only SQL

  • Redis
    • 适合处理不需要长期访问的数据存储
    • 数据存储于 RAM 中
    • 数据存储有限, 但数据操作非常快
    • npm install redis
  • MongoDB
    • 通用的 非关系型 数据库,
    • npm install mongodb
  • Mongoose
    • 其可以顺畅地使用MongoDB
    • 提供了一些实用的功能

6. Connect

其是一个框架, 使用中间件的模块化组件.

1. 搭建一个Connect程序

  • 第三方模块需要安装. npm install connect
var connect = require('connect');
var app = connect();
app.listen(3000);

2. 工作机制

  • 其中间件概念受到Ruby的Rack框架的启发.
    • 小巧
    • 自包含
    • 可以在整个程序中重用
  • next() 在中间件里调用, 用回调函数,而不是从方法中返回, 是为了可以在中间件组件里运行异步逻辑.
var connect = require("connect");

function logger(req, res, next) {
  console.log("%s %s", req.method, req.url);
  next();
}

function hello(req, res) {
  res.setHeader("Content-Type", "text/plain");
  res.end("hello world!");
}

connect()
  .use(logger)
  .use(hello)
  .listen(3000);

3. 中间件的顺序很重要

如果前一个中间件,不调用next(), 命令链中的后续中间件都不会被调用.

4. 挂载中间件和服务器

可以根据挂载的路径前缀.选择性的调用中间件

var connect = require("connect");

connect()
  .use(logger)
  .use('/admin',restrice)
  .use('/admin',admin)
  .use(hello)
  .listen(3000);
function admin(req, res, next) {
  switch (req.url) {
    case "/":
      res.end("try /users");
      break;
    case "/users":
      res.setHeader("Content-Type", "application/json");
      res.end(JSON.stringify(["tobi", "loki", "jane"]));
      break;
  }
}

5. 创建可配置中间件

利用闭包, 返回可以配置的中间件

function setup(options) {
  // 设置逻辑
  
  return function (req, res, next) {
    // 中间件逻辑
  } 
}
app.use(setup({some:'options'}))

你可能感兴趣的:(Node.js 实战 (第二部分))