学了几天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. jQuery插件-表单验证插件-Validation

    1.Validation简介 标准的验证方法库 1)内置验证规则:必填,数字,E-Mail,URL和信用卡号码等19类内置验证规则. 2)自定义验证规则:自定义 3)验证信息提示:默认了验证信息提示, ...

  2. Ubuntu+Apache+PHP+Mysql环境搭建

    一.操作系统Ubuntu 14.04 64位,虚拟机服务器 二.Apache 1.安装Apache,安装命令:sudo apt-get install apache2 2.环境配置: 1)配置文件:路 ...

  3. Thinkphp .htaccess 与 httpd.ini文件重定向转换问题

    .htaccess 文件内容 RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !- ...

  4. PhpExcel笔记,phpExcel中文帮助手册

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  5. [20160704]Addition program that use JOptionPane for input and output

    //Addition program that use JOptionPane for input and output. import javax.swing.JOptionPane; public ...

  6. 项目中Ajax调用ashx页面中的Function的实战

    前台页面: 使用几个display=none的空间存储DropdownList中的值,点击Search Button后刷新页面再次给DropdownList赋值使用 <%@ Page Langu ...

  7. iOS 开启data protection 的方法

    我这里说的data protection,指的是设备设置密码后,如果设备锁屏,并且当前解锁需要密码(有时可能因为自己的设定,导致会再几小时后才需要密码),这时应用程序处于加密状态,无法从外部读取.如果 ...

  8. 关闭window 8.1 的skydrive

    gpedit.msc-->计算机配置-->管理模板-->windows组件 -->skydrive-->阻止使用skydrive执行文件存储

  9. Greedy:Jessica's Reading Problem(POJ 3320)

    Jessica's Reading Problem 题目大意:Jessica期末考试临时抱佛脚想读一本书把知识点掌握,但是知识点很多,而且很多都是重复的,她想读最少的连续的页数把知识点全部掌握(知识点 ...

  10. JS调用自定义弹窗【bootstrap】

    function commonConfirm(msg,call){ showConfirmBox("消息提示",msg,call); } $(document).on('click ...