`

Node.js实战应用——构建静态文件http服务器

阅读更多

这是我第一次使用Node.js来编程,而且是构建一个一个静态文件资源访问的Http server。

我个人从事java相关的开发差不多有10年了吧,一直都是在构建后端的服务、应用。对于前端一直没有过多的接触。对于servlet、jsp等技术也仅限于工作的需要(包含struct等mvc框架)。

最近工作中,参与负责了公司产品Object-Centric理念的开发模式构建。利用Business model对象拉通前后端的开发体验,通过Business Model 对象组织所有和该业务模型对象关联的资源:实体模型、试图模型、服务(rest)、业务校验、数据转换处理、页面等。

目前由于参与到前端页面相关技术的构建和研究,突然对这方面的技术产生了浓厚的兴趣。对Node.js、AngularJS、TypeScript都有兴趣深入的学习和使用。后面打算再把mangodb纳入到学习计划中,这样就把MEAN技术拉通了:)。

下面就是我基于Node.js实现的一个简单的静态页面文件的http server,总体体验来说,在编码的高效性、灵活性等体验,对比java实现会好很多。但是在类型的识别、编译错误的识别、类型的提示上没有强语言类型的java来的好。

首先来看一下整个工程的目录结构: 

目录说明:

HTTP_SERVER:整个工程的根目录;

app:静态文件存放的目录,对于我来说就是我“未来”期望一个web工程的根目录,对应于java构建web应用,就是web-app了。

css:用来存放样式定义文件

文件说明:

server.js:提供静态http服务的主程序。

mine.js:键值对的配置文件,定义了对不同的文件类型的处理定义。

index.html:web app中的首页,静态的html的文件。

indx.css:index.html首页引用的层叠样式表的定义文件。

首先来看一下server.js的实现:

 

var http = require('http');
var url = require('url');
var fs = require('fs');
// 自己定义的类型定义文件
var mine = require('./mine').types;
var path = require('path');

var port = '3000';
var hostname = '127.0.0.1';

var server = http.createServer((req, res) => {
    var pathName = url.parse(req.url).pathname;
    // url.parse会将一个请求的路径解析为格式化的输出
    /*
    { 
        protocol : 'http' ,
        auth : null ,
        host : 'example.com:8080' ,
        port : '8080' ,
        hostname : 'example.com' ,
        hash : null ,
        search : '?a=index&t=article&m=default',
        query : 'a=index&t=article&m=default',
        pathname : '/one',
        path : '/one?a=index&t=article&m=default',
        href : 'http://example.com:8080/one?a=index&t=article&m=default'
    }
    */
    var realPath = path.join("app", pathName);
    console.log(realPath);

    var ext = path.extname(realPath);
    ext = ext ? ext.slice(1) : 'unknow';
    // ext = ext ? ext.split('.')[1] : 'unknown';
    fs.stat(realPath, (err, stats) => {
        if (err) {
            console.log(err);
            res.writeHead(404, { 'Content-Type': 'text/plain' });
            res.write(`This request URL ${pathName} was not found on this server.`);
            res.end();
        } else {
            fs.readFile(realPath, "binary", (err, data) => {
                if (err) {
                    res.writeHead(500, { 'Content-Type': 'text/plain' });
                    res.end(err);
                } else {
                    console.log(data);
                    var contentType = mine[ext] || "text/plain";
                    res.writeHead(200, { 'Content-Type': contentType });
                    res.write(data, "binary");
                    res.end();
                }
            })
            console.log(stats);
        }
    });
});

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

代码的一点说明:

var ext = path.extname(realPath);

ext = ext ? ext.slice(1) : 'unknow';

这两句其实是通过截取访问路径的最后的字符串,来获取访问的文件类型。例如,下面的url:http://localhost:3000/index.html。通过这两句处理之后,ext内的值是html。如果url是:http://localhost:3000/index,那么ext的值就是unknow。

fs.stat(realPath, (err, stats) => {

}

这个里面的处理,是我不同于网上参考实现的处理。是我自己查阅了node.js的实现,根据node.js的说明文档自己添加的,其实就是对文件的一个预处理,防止对文件直接操作抛出异常。

再看一下mine.js的代码实现:

exports.types = {
    "html": "text/html",
    "xml": "text/xml",
    "js": "text/javascript",
    "css": "text/css",
    "json": "application/json",
    "txt": "text/plain",
    "pdf": "application/pdf",
    "doc": "application/msword",
    "xls": "application/vnd.ms-excel",
    "ico": "image/x-icon",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "png": "image/png",
    "bmp": "image/bmp",
    "svg": "image/svg+xml",
    "tiff": "image/tiff",
    "gif": "image/gif",
    "swf": "application/x-shockwave-flash",
    "wav": "audio/x-wav",
    "wma": "audio/x-ms-wma",
    "mp3": "audio/mpeg",
    "wmv": "video/x-ms-wmv",
    "avi": "video/x-msvideo",
    "gz": "application/x-gzip",
    "manifest": "text/cache-manifest"
};

 这个文件没什么好说的,主要是还i应用在返回时,设置httpheader的内容使用。

再看一下html,这个也是我参考了网上的实现,不过我稍微做了一点改造,增加了一点javascript的代码做测试:

 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>春晓</title>
    <link href="./css/index.css" rel="stylesheet" type="text/css">
    <script>
        function displayDate() {
            document.getElementById("demo").innerHTML = Date();
        }
    </script>
</head>

<body>
    <nav>春晓</nav>
    <div id="value">
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p>
    </div>

    <h1>My First JavaScript</h1>
    <p id="demo">This is a paragraph.</p>
    <button type="button" onclick="displayDate()">
Display Date</button>
</body>

</html>

 再把css的定义文件贴上来,其实也是我参考网上的实现:

body{
    background-color:#222222;
}
nav {
    color:#cc0000;
    font-weight:bold;
    font-size:2em;
}
#value{
    color:#cc0000;
    font-size:2.1em;
}

运行server.js:

首先通过命令行,进入到工程的根目录下:

我是在vsc(visula stuido code)中,直接选中server.js右键选择〔在命令提示符中打开〕



在命令中输入node server.js



 回车后,启动服务,并看到日志输出:



 在浏览器中输入:http://localhost:3000/index.html得到的页面:



 就可以正常看到我们定义的app目录下的index.html文件,同时在这个文件中定义的js也可以正常运行。

 

总结:使用node.js的确可以快速、高效的完成前端的开发,相对于java很高效。同时,对于我习惯于java开发的人来说,里面的一些语法、写法确实有些不太习惯。

 

下一步,是准备利用express这个框架来搭建相同的静态http server的实现。

在下一步就是构建基于mongodb的小应用了,最后在引入typeScript,嘿嘿,还是挺有意思的。

  • 大小: 12.9 KB
  • 大小: 19.5 KB
  • 大小: 43.2 KB
  • 大小: 52.2 KB
  • 大小: 30.6 KB
分享到:
评论

相关推荐

    2019年最新node.js+ES+Koa2手把手教你开发一个短视频网站视频教程

    根据提供的文件标题、描述、标签以及部分内容链接,我们可以总结出一系列与Node.js、ES(ECMAScript)以及Koa2相关的技术知识点。由于具体内容无法直接访问查看,以下内容基于标题和描述进行推断和总结。 ### 知识...

    VUE + nodejs实战

    nodejs实战”项目中,我们主要探讨的是如何将两种强大的技术——Vue.js(一个轻量级的前端JavaScript框架)和Node.js(一个基于Chrome V8引擎的JavaScript运行环境)相结合,以构建高效、响应式的Web应用程序。...

    subnodes-chat:使用node.js构建的简单聊天室

    **子节点聊天室——基于Node.js的实时通讯实践** `Subnodes-chat` 是一个使用 `Node.js`、`Socket.IO` 和 `Express` 框架构建的简单聊天室应用,专为配合 `Subnodes` 平台而设计。这个项目正处于持续开发阶段,意味...

    毕业设计——力美健身俱乐部业务管理子系统(node+express+sequelice+mysql).zip

    2. **Express**: Express是Node.js的一个Web应用框架,提供了快速构建Web应用的工具和中间件。它简化了路由设置、中间件使用和视图渲染,使得开发流程更为高效。 3. **Sequelize**: Sequelize是一个基于Promise的...

    cycle-live-todo:我的Node.js惠灵顿循环演讲的livecoding示例

    【标题】"Cycle-live-todo"是一个基于Node.js的项目,展示了在编程演讲中的实时编码(livecoding)示例。这个项目特别关注于JavaScript...对于想要提升JavaScript和Node.js技能的开发者来说,这是一个很好的实战案例。

    starting-express:Makers Academy 第 7 周活动 - Express for Node.js 简介

    Express.js是基于Node.js的Connect中间件构建的,它简化了HTTP服务器的创建,提供了丰富的API和中间件系统,使得开发者能够快速搭建Web服务器。Express遵循了RESTful设计原则,可以轻松处理路由、请求和响应,极大地...

    node-course

    10. **实战项目**:通过实际项目来巩固所学知识,例如构建一个RESTful API服务、聊天室应用或者静态文件服务器。 在这个过程中,你还会接触到Node.js生态系统中的各种工具和库,如Webpack、Babel、ESLint等,这些都...

    百度音乐搜索模块

    Node.js是一种流行的JavaScript运行环境,它以其非阻塞I/O和事件驱动的特性,尤其适合构建高性能的网络应用,包括Web服务和API接口。 首先,我们要理解Node.js的基础。Node.js是建立在Chrome V8引擎之上的,它允许...

    mongodb-express-blog:基于node.js的博客系统

    总结来说,MongoDB-Express-Blog是一个典型的Node.js全栈应用实例,它展示了JavaScript如何在服务器端发挥威力,结合MongoDB的强大数据库功能,构建出功能完善的博客系统。对于学习和实践Node.js的开发者而言,这样...

    node-socket-dojo

    《Node.js与Socket.IO实战:构建实时Web应用——基于“node-socket-dojo”项目》 在现代Web开发中,实时交互已经成为一个重要的需求,而Node.js和Socket.IO的组合正是实现这一目标的强大工具。"node-socket-dojo"是...

    轻量级HttpServer.zip

    《轻量级HttpServer——构建高效微型Web服务》 在当今互联网时代,HTTP服务器作为Web应用的核心组件,扮演着至关重要的角色。轻量级HttpServer,正如其名,是一种资源占用少、启动快速、可扩展性强的服务器软件,...

    node-blog:节点博客

    文件列表中的"node-blog-main"可能包含了项目的主文件或者源代码目录,里面可能有如app.js(应用入口文件)、models(数据库模型定义)、routes(路由配置)、views(视图模板)以及public(静态资源)等目录。...

    毕业设计:考勤系统(Vue+Webpack+ElementUI).zip

    这是一个基于前端Vue.js框架、Webpack构建工具以及Element UI组件库的毕业设计项目——考勤系统。这个项目的主要目的是实现一个高效、用户友好的考勤管理平台,帮助组织追踪员工的出勤情况。以下是对该项目各个组成...

    Stripe-React-Node:全栈React&Node应用

    **全栈React与Node应用——Stripe支付集成** 在现代Web开发中,全栈框架的应用越来越广泛,它允许开发者使用同一套技术栈进行前端和后端的开发,提高开发效率和协同工作能力。在这个项目中,我们关注的是一个使用...

    api-node-js-ts-Sales:根据Aluizio Dev

    【标题】:“API开发实战:基于Node.js与TypeScript的Sales API实现——Aluizio Dev作品” 【描述】:这个项目展示了如何使用Node.js和TypeScript构建一个功能完善的Sales API。Aluizio Dev,一位专注于软件开发的...

    nodeJsTeamProject

    《Node.js团队项目实战——基于TypeScript》 在IT行业中,Node.js因其高效、轻量级的特性,已经成为构建服务器端应用的热门选择。而TypeScript作为JavaScript的超集,为开发人员带来了静态类型检查、类和接口等强...

    java毕设:办公自动化系统——springboot+vue+element-ui 前后端分离.zip

    该资源是一个基于Java技术栈开发...总的来说,这个Java毕设项目为学习者提供了一个实战平台,不仅可以深入理解SpringBoot和Vue.js的结合应用,还能了解到前后端分离开发的实际流程,对提升编程技能和项目经验大有裨益。

    毕业设计-医院系统之门诊挂号系统.zip

    《医院系统之门诊挂号系统——基于前端Vue.js与JavaScript实现》 在当今信息化时代,医疗系统的建设已经成为提高医疗服务效率和质量的重要手段。本项目“毕业设计-医院系统之门诊挂号系统”提供了一套完整的前端...

    nodejs-todolist-multihw

    【描述】在"nodejs-todoList"项目中,开发者使用了JavaScript的服务器端版本——Node.js,创建了一个可操作的待办事项列表。这个应用的核心在于,它通过与PostgreSQL数据库的连接,实现了数据的持久化存储。...

    高仿移动端网易云音乐 Vue前端项目

    本项目——“高仿移动端网易云音乐 Vue前端项目”正是基于这样的需求,利用Vue.js生态中的核心技术,如Vue、Vue-Router、Vuex和Webpack,以及Axios库,打造了一个功能丰富的音乐播放应用,为用户带来流畅的移动端...

Global site tag (gtag.js) - Google Analytics