【Node.js学习笔记】1、新建一个简单的服务器

基本概念

Node.js作为一个服务端脚本语言,不像.net或者java一样需要iis这样的web服务器,它本身实现了这个功能。
Node.js是单进程单线程应用程序,由事件驱动,收到一个请求后直接放到事件队列中,然后继续等待请求,而不是收到请求后立即执行。然后由事件处理程序来执行回调函数。

初始代码

const http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
   response.end('Hello World\n');
}).listen(8233);

访问网址http://localhost:8233

代码解析

const http = require('http');

nodejs中用require命令引入模块,此处引入http模块。

http.createServer(function (request, response) {
    
}).listen(8233);

http模块的createServer方法创建一个web服务器,然后用listen方法决定监听的端口。

response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');

writeHead是写响应头,end发送响应内容。

代码演进:nodejs的路由,处理url

在一个正常的服务器程序中,基本不可能像我们上面那样只返回一个helloworld。
往往需要根据url的不同来返回响应的信息。
这里我们输出请求的url:

const http = require('http');

http.createServer((request, response) => {
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.write(`url: ${request.url}`);
  response.end();
}).listen(8233);

访问网址http://localhost:8233/insert/abc?id=1&name=1输出结果:

 url: /insert/abc?id=1&name=1

这里我们需要解析请求的url,解析一个字符串还是比较简单的,这里就不需要我们去做了,nodejs有专门的模块去处理。
修改代码为:

const http = require('http');
const url = require('url');
const querystring = require('querystring');

http.createServer((request, response) => {
  const urlInfo = url.parse(request.url);
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.write(`url: ${request.url}\n`);
  response.write(`pathname: ${urlInfo.pathname}\n`);
  response.write(`query: ${urlInfo.query}\n`);

  const queryInfo = querystring.parse(urlInfo.query);
  response.write(`id: ${queryInfo.id}`);
  response.end();
}).listen(8233);

输出结果为:

url: /insert/abc?id=1&name=1
pathname: /insert/abc
query: id=1&name=1
id: 1

代码演进:对路由的处理

const http = require('http');
const url = require('url');
const querystring = require('querystring');

const db = {
  users: [],
};

const router = (pathname, queryInfo) => {
  switch (pathname) {
    case '/add':
      db.users.push({
        id: db.users.length + 1,
        name: queryInfo.name,
      });
      break;
    case '/delete':
      db.users = db.users.filter(l => l.id.toString() !== queryInfo.id);
      break;
    default:
      break;
  }
};

const getDbInfo = () => db.users.reduce(
  (pre, next) => `${pre}id:${next.id}   name:${next.name}\n`,
  '',
);

http.createServer((request, response) => {
  const urlInfo = url.parse(request.url);
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  const queryInfo = querystring.parse(urlInfo.query);
  router(urlInfo.pathname, queryInfo);
  response.write(getDbInfo());
  response.end();
}).listen(8233);

在这里
通过http://localhost:8233/add?name=troy这样的路径增加数据
通过http://localhost:8233/delete?id=1这样的路径删除数据

代码演进:模块化处理

一般的服务器不可能将所有的代码写在一个文件里,那么这里将上面的代码划分为不同的模块。
代码结构如下:


【Node.js学习笔记】1、新建一个简单的服务器_第1张图片
代码结构

db.js

/**
 * 数据管理
 */

const db = {
  users: [],
};

exports.getDbInfo = () => db.users.reduce(
  (pre, next) => `${pre}id:${next.id}   name:${next.name}\n`,
  '',
);

exports.deleteData = (id) => {
  db.users = db.users.filter(l => l.id.toString() !== id);
};

exports.addData = (name) => {
  db.users.push({
    id: db.users.length + 1,
    name,
  });
};

router.js

/**
 * 路由分配
 */

const db = require('./db');

const route = (pathname, queryInfo) => {
  switch (pathname) {
    case '/add':
      db.addData(queryInfo.name);
      break;
    case '/delete':
      db.deleteData(queryInfo.id);
      break;
    default:
      break;
  }
};

exports.route = route;

server.js

/**
 * 服务器设置
 */

const http = require('http');
const url = require('url');
const querystring = require('querystring');
const router = require('./router');
const db = require('./db');

http.createServer((request, response) => {
  const urlInfo = url.parse(request.url);
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  const queryInfo = querystring.parse(urlInfo.query);
  router.route(urlInfo.pathname, queryInfo);
  response.write(db.getDbInfo());
  response.end();
}).listen(8233);

小结

通过搭建一个简单的Node.js服务器,了解了nodejs的服务器搭建,模块化处理,路由处理的一些简单玩法。算是对Node.js有了一个初步的了解。

你可能感兴趣的:(【Node.js学习笔记】1、新建一个简单的服务器)