学了几天Nodejs 后我又干上了前端的活。这次遇到的问题是,我想在不同的设备上方便的查看我编写的网页,很自然的就想到要是能在本地搭建一个简单的http服务器的话,那局域网内的所有设备都可以访问了,这可是极好的。于是趁热马上动手实现一个简单服务器。

需求:访问http://192.168.1.100/index.html 可以返回指定网页及其涉及的资源(css,js,图片文件等)

function start(route, handle) {
http.createServer(function(request, response) { request.addListener("end", function(){ fetchFile(request, response)
}) }).listen(8888);
}

调用createServer 方法创建一个服务器并监听8888端口,在回调内监听end 事件,并把抓取文件并返回的工作交给即将尚未编写的fetchFile 函数。

var typeMap = {
".png" : "image/png",
".jpg" : "image/jpeg",
".js" : "application/javascript",
".css" : "text/css",
".html" : "text/html"
}

接下来,在编写fetchFile 之前,我们需要一个 “后缀名->Conent-Type” 的表,这样在浏览器访问指定资源的时候,我们能返回响应的Content-Type。

var fs = require('fs')
function fetchFile(req, res) {
var url = req.url
fs.readFile("."+req.url, function(err, data) {
var contentType = "text/plain"
if (!err) {
// find type of file
for (key in typeMap) {
if (req.url.match(key)) {
contentType = typeMap[key]
break
}
}
res.writeHead(200, {"Content-Type": contentType})
res.write(data)
res.end()
}
else {
res.writeHead(404, {"Content-Type":contentType})
res.end()
}
})
}

最后一步,当我们收到一个请求的时候,只需把请求的url 拿出来,在typeMap 里找出响应的Content-Type,之后调用fs 模块的异步文件读取方法,

  • 如果文件存在,我们就返回正确的头信息,附上文件内容,发送响应。
  • 如果文件不存在,返回404状态码,结束响应。

最后不要忘记调用我们的start 方法。

完整代码:

var http = require("http");

function start(route, handle) {
http.createServer(function(request, response) { request.addListener("end", function(){
fetchFile(request, response)
}) }).listen(8888);
} var typeMap = {
".png" : "image/png",
".jpg" : "image/jpeg",
".js" : "application/javascript",
".css" : "text/css",
".html" : "text/html"
} var fs = require('fs')
function fetchFile(req, res) {
var url = req.url
fs.readFile("."+req.url, function(err, data) {
var contentType = "text/plain"
if (!err) {
// find type of file
for (key in typeMap) {
if (req.url.match(key)) {
contentType = typeMap[key]
break
}
}
res.writeHead(200, {"Content-Type": contentType})
res.write(data)
res.end()
}
else {
res.writeHead(400, {"Content-Type":contentType})
res.end()
}
})
} start()

server.js

[Nodejs]十分钟快速编写简单静态文件服务器的更多相关文章

  1. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  2. 十分钟快速入门 Python,看完即会,不用收藏!

    本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...

  3. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  4. 十分钟快速入门 Python

    本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...

  5. 十分钟快速上手NutUI

    本文将会从 NutUI 初学者的使用入手,对 NutUI 做了一个快速的概述,希望能帮助新人在项目中快速上手. 文章包括以下主要内容 安装引入 NutUI NutUI 组件的使用 NutUI 主题和样 ...

  6. Python语言十分钟快速入门

    Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. AD:[51CTO技术沙龙]移动时代 ...

  7. HDFS+MapReduce+Hive+HBase十分钟快速入门

    1.     前言 本文的目的是让一个从未接触Hadoop的人,在很短的时间内快速上手,掌握编译.安装和简单的使用. 2.     Hadoop家族 截止2009-8-19日,整个Hadoop家族由以 ...

  8. Redis 十分钟快速入门

    本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用. 1. Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的ke ...

  9. 巨杉Tech | 十分钟快速搭建 Wordpress 博客系统

    介绍 很多互联网应用程序开发人员第一个接触到的网站项目就是博客系统.而全球使用最广的Wordpress常常被用户用来快速搭建个人博客网站.默认情况下,Wordpress一般在后台使用MySQL关系型数 ...

随机推荐

  1. CCF 模拟E DFS深搜

    http://115.28.138.223:81/view.page?opid=5 这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数 数据量不大这样做也能AC #includ ...

  2. BZOJ 1485: [HNOI2009]有趣的数列

    Description 求长度为 \(2n\) 的序列.要求 1. \(a_1<a_3<a_5<...<a_{2n-1}\) . 2. \(a_2<a_4<a_6& ...

  3. ajax给全局变量赋值问题解决

    $.ajax({ type: "post", //以post方式与后台沟通 url: "./php/chartAjax.php", //与此php页面沟通 da ...

  4. 注册页面的js验证

    简单的用户注册页面:(html) 包含用户名格式验证.邮箱格式验证.确认密码一致性验证和必填项验证.(纯javascript) <center> <h1>用户注册</h1 ...

  5. jsp自定义标签(时间格式化包括Long转时间)

    1.jsp自带标签的格式化: jstl fmt 函数大全:主要针对格式化功能 Tags   fmt:requestEncoding fmt:setLocale fmt:timeZone fmt:set ...

  6. Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装

    Appium是个好东东,Android,iOS都支持,并且居然RobotFramework也支持Appium了,这就是本文要介绍的AppiumLibrary. 通过前面的文章大家知道可以使用多种语言来 ...

  7. C++构造函数、析构函数与抛出异常

    [本文链接] http://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html [问题] 构造函数可以抛出异常么?析 ...

  8. hnu10104

    AC自动机+DFS #include <cstdio> #include <queue> #include <cstring> using namespace st ...

  9. linux的提示信息--/etc/motd和/etc/issue

    /etc/motd 即 message of the day 每次用户登录时,这个文件的内容都会显示在用户的终端上.如果shell支持中文,还可以使用中文,这样看起来更加舒服. 成功登录后,自动输出. ...

  10. Java实现注册邮箱激活验证

    邮件发送servelet实现 package com.xbs.register.main; import java.io.IOException;import java.util.Date;impor ...