使用Node.js实现一个简单的web服务器

这是使用Node.js写的一个简单Web服务器示例,分为三部分:

  1. 响应http请求
  2. 路由url
  3. 读取静态文件响应

新建一个app.js文件作为此web服务器的入口。

响应http请求

首先我们引入http模块,创建一个http服务器。

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});


server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

http的createServer方法接收一个函数作为参数。此函数有两个参数request和response,它将用来处理和响应http请求。

示例里response做了简单的三件事:

  1. res.statusCode=200:设置响应码statusCode为200
  2. res.setHeader("Content-Type","text/plain"):设置响应头Content-Type为text/plain。
  3. res.end('Hello World\n'):最后使用res.end()方法向请求返回文本。

server.listen指定服务器监听的端口。

这样一个可以用来接收http请求和做出简单响应的web服务器就完成了。

启动web服务器

node app.js

在浏览器输入http://127.0.0.1:3000

路由url

对一个wen服务器来说,需要接收不同的url,根据url不同返回请求内容,即路由。

const server = http.createServer((req, res) => {
    route(req,res);
});

const ROUTES = [
    {path:"",content:"<html><head><meta charset='UTF-8' ></head><body><a href='en'>english</a><br /><a href='cn'>中文</a></body></html>"},
    {path:"/en",content:"Welcome to the world of Node.js!"},
    {path:"/cn",content:"<html><head><meta charset='UTF-8' ></head><body>欢迎进入Node.js的世界!</body></html>"}
]

function route(req,res) {
    let requestUrl = req.url;
    const match = requestUrl.match(/\/+$/);
    if(match) {
        requestUrl = requestUrl.substring(0,match.index);
    }

    for(let route of ROUTES) {  //查询route的url
        if(route.path == requestUrl) {
            responseText(res,StatusCode.SUCCESS, route.content);
            return;
        }
    }
    responseText(res,StatusCode.NOTFOUND,"Page Not Found.");
}

function responseText(res, statusCode, text) {
    res.statusCode = statusCode;
    res.setHeader('Content-Type', 'text/html');
    res.end(text);
}

现在处理的代码移到route函数里,由route对url处理,根据不同的url返回响应的内容。

其中,ROUTES常量配置了不同url对应的返回内容。当在ROUTES找不到对应的url,返回404。

这样就完成了一个简单的路由。

读取静态文件响应

很明显,上面的路由需要我们配置所有的url。在现实项目里,我们会根据不同的url,然后路由到url对应的文件(html,js,css)。这一步我们会修改路由,让路由由url转换为对应的文件,然后返回文件内容。

/**
 * 此函数根据url路由到对应的文件,并响应文件内容
 */
function routeToFile(req,res) {
    let requestUrl = req.url;
    const match = requestUrl.match(/\/+$/);
    if(match) {
        requestUrl = requestUrl.substring(0,match.index);
    }

    let filePath;
    //如果请求的url没有后缀,返回目录下的index.html
    if(path.extname(requestUrl)  == '') {
        filePath = path.join(wwwRoot,requestUrl, "index.html");
    } else {
        filePath = path.join(wwwRoot,requestUrl);
    }

    if(filePath) {
        //响应文件内容
        responseFile(res, filePath);
    }else {
        responseText(res,StatusCode.NOTFOUND, "Page Not Found");
    }
}

const fs = require("fs");
function responseFile(res,filePath) {
    fs.exists(filePath,(exists) => {
        if(exists) {
            //文件存在响应文件内容
            const stream = fs.createReadStream(filePath,{flags:"r",encoding:null});
            res.statusCode = StatusCode.SUCCESS;
            res.setHeader('Content-Type', getContentType(filePath));
            stream.pipe(res);
        } else {
            //文件不存在返回404
            responseText(res,StatusCode.NOTFOUND,"Page Not Found.");
        }
    });
}

const CONTENT_TYPES = [
    {ext:".js",contentType:"text/javascript"},
    {ext:".css",contentType:"text/css"},
    {ext:".html",contentType:"text/html"}
]
function getContentType(file) {
    let ext = path.extname(file);
    for(let ct of CONTENT_TYPES) {
        if(ct.ext == ext) {
            return ct.contentType;
        }
    }
    return "text/html";
}

这样一个简单的web服务器就完成了。

这只是一个简单的示例,在实际项目中,我们可以使用express来作为web服务器。

版权声明:著作权归作者所有。

相关推荐

添加已有项目到远程服务器的Git仓库

按一下步骤添加已有项目到远程服务器的git仓库:1、在项目的根目录下初始化为git本地仓库git init 2、添加项目的所有文件到本地仓库,在项目的根目录执行:git add . 3、提交已添加的文件到本地仓库:git commit -m 'First commit' -m:用于添加提交日志4、添加远程git仓库获取项目在远程

Windows使用nvm-windows管理node.js多版本切换

nvm和n是两个在Mac/Linux上常用于管理node版本的工具,遗憾的是这两个工具都不支持Windows。在Windows可以用来管理Node版本的工具主要有:nvm-windows,nodist。本文主要介绍使用nvm-windows来管理node的版本。首先nvm-windows并非nvm的Windows版本,它是单独开发的用于在Windows管理Node版本的工具。nvm-window项

Spring Boot设置服务器的端口

Spring Boot默认内嵌的web服务器为tomcat,端口为8080。如果想修改内嵌tomcat插件的端口有三种方式:在application.properties里修改在java的启动脚本里设置在java代码里设置在application.properties设置server.port=9999 如果是application.yml,设置如下:server:  &nbs

Node.js在server端使用jQuery

Node.js在server端使用jQuery来做DOM操作。安装jQuerynpm install jQuery var $ = require('jQuery'); 直接使用var title = $(html).find('title').text(); $("<h1>你好</h1&g

使用nvm管理node.js版本(安装/升级/切换版本)

使用nodejs,我们可能需要维护多个版本的nodejs,使用nvm可以很好帮我们对nodes安装,升级以及管理多版本。安装nvmnvm提供了安装脚本,使用安装脚本安装如下:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.5/install.sh | bash 或wget&nbs

Node.js交互式解释器(REPL)中下划线_的使用

Node.js的REPL(即node 控制台)默认会把最近表达式的结果赋值给下划线_代表的变量:> 1 + 2 3 > _ 3 在6.x后,可以通过对下划线_代表的变量赋值,就可以关闭node控制台的这种默认情况。> [ 'a', 'b', 'c' ] [ 'a',&nb