【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这样的路径删除数据

代码演进:模块化处理

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


代码结构

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是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,638评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,088评论 2 58
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 一只鹅 伸长脖子几乎贴地 奔我而来。 一只狗 露出长牙欲扑状 朝我狂吠。 爱上的那个人 把我拉黑将我 驱逐出她的世界
    南冠阅读 170评论 0 1
  • 有幸认识简书。 第一篇文章,竟一时不知道写些什么。 早上看娱乐新闻,吴佩慈四年生三胎。 看到标题,心中一阵酸楚。 ...
    小宇宙_6d70阅读 411评论 0 1