利用node构建本地服务

首先安装下node.js,地址为https://nodejs.org/en/,然后安装npm。

node.js的中文api地址http://nodeapi.ucdok.com/#/api/

一些模块的用法可以在自己的终端试试哦,通过node这个命令进入node.js环境。如下图

利用node构建本地服务,用到的模块有http、fs、path着三个模块,其中http是用来创建服务的;fs时文件模块,可读写等本地文件;path是一套用于处理和转换文件路径的工具集(具体见http://nodeapi.ucdok.com/#/api/path.html)。

这个构建的原理跟nginx代理访问本地页面是一样的~,将ip(port)映射到本地的静态资源的路径,然后根据url的相对路径找到资源,有点表达的词不达意~

说一下简单的流程

  • 利用http模块的createServer方法起一个服务(可以把request和response打印出来哦,加深理解),listen实现对端口的监听
  • 变量staticUrl保存着我们要访问的静态资源的路径。用path解析url得到相对路径,把staticUrl与之拼接起来就可以得到绝对路径了,用强大的fs模块读取文件,就ok了
  • 有可能url访问的不适本地的资源~嘿嘿,我们就要做些处理了,类似如404
  • 由于加载的html带有js img css各种不同类型的文件,用过ajax的就知道我们要设置好请求头了,不过这里我们是将本地的资源返回给浏览器这个客户段,所以我们要设置好响应头~就建立了一个一个公共的mine.js用来存放文件类型

不多说啦,那就直接看下面的代码吧~

var http = require('http');
var fs = require('fs');
var path = require('path');
var mine = require('./mine').types; //content-type格式
//静态资源的路径
var staticUrl = '/Users/admin/Documents/materials/demo/excise';
var server = http.createServer(function(req,res){
//req,res均为对象,req是http.IncomingMessage的一个实例,res是http.ServerResponse的一个实例
//console.log(res);
var url = req.url;
//浏览器输入localhost:9000/index.html, 那url == '/index.html'
//console.log(url);
var file = staticUrl + url,
type = path.extname(url); //path.extname 返回路径中文件的扩展名
//console.log(type)
type = type ? type.split('.')[1] : 'unknown';
fs.readFile(file , function(err,data){
if(err){
console.log('访问'+staticUrl+req.url+'出错');
res.writeHeader(404,{
'content-type' : 'text/html;charset="utf-8"'
});
res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
}else{
res.writeHeader(200,{
'content-type' : mine[type] || 'text/html;charset="utf-8"'
});
res.write(data); //将index.html显示在浏览器(客服端)
}
res.end();
});
}).listen(9000); console.log('服务器开启成功\n\n访问路径为http://localhost:9000/index.html\n');

使用过ajax的筒靴肯定知道contentType,这是对文件类型的设置。由于我们构建的是一个项目的服务,那么文件类型就多了起来,所以建立一个公共的mine.js用来存放文件类型

// 数据格式标签mime的主要类型
// 参考http://www.w3school.com.cn/media/media_mimeref.asp
/*
application/
text/
image/
audio/
video/
chemical/
message/
multipart/
model/
*/ 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"
};

利用node构建本地服务的更多相关文章

  1. 用node搭建本地服务环境

    const express = require('express'); const path = require('path'); const request = require('request') ...

  2. 利用node搭建本地服务器调试代码

    在命令符中输入 npm install -g live-server安装live-server 安装完成后在项目文件夹下打开cmd,输入live-server启动

  3. react-router-dom和本地服务本地开发 (node、webpack)

    场景 使用react 做开发,避免会使用react-router React Router 已经是V4的版本 React Router 目前已经被划分成了三个包:react-router,react- ...

  4. Python 启动本地服务

    在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer,我们可以很简单的使用  python -m SimpleHTTPServ ...

  5. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  6. 微服务架构 - 基于Harbor构建本地镜像仓库

    之前写过<搭建docker本地镜像仓库并提供权限校验及UI界面>文章,然后有同仁评论道这样做太复杂了,如果Harbor来搭建会更简单同时功能也更强大.于是抽时间研究了基于Harbor构建本 ...

  7. 利用Node 搭配uglify-js压缩js文件,批量下载图片到本地

    Node的便民技巧-- 压缩代码 下载图片 压缩代码 相信很多前端的同学都会在上线前压缩JS代码,现在的Gulp Webpack Grunt......都能轻松实现.但问题来了,这些都不会,难道就要面 ...

  8. node本地服务启动报Error: listen EADDRINUSE解决方法

    Error: listen EADDRINUSE 127.0.0.1:1337 at Object.exports._errnoException (util.js:1018:11) at expor ...

  9. 在服务端C#如何利用NPOI构建Excel模板

    目前本人接触过两种模板导出的方式:(1)C#利用NPOI接口制作Excel模板,在服务端用数据渲染模板(2)在前端利用前人搭建好的框架,利用office编写xml制作模板,在客户端进行数据的渲染,导出 ...

随机推荐

  1. django orm 操作

    django的orm使用方便,但对于一些复杂的操作,需要遵循特定的规范,特例特别记录一下: 模型: from django.db import models class Blog(models.Mod ...

  2. PSP个人(观众界面)

    需求:作为一个观众,我希望了解某一场比赛的比分,以便了解赛况.(满意条件:精确到每一局的结果比分) 需求分析:实现查询数据库中每一局的分数并用界面显示. 生成设计文档: 运用三层架构,实现软件的基本功 ...

  3. HDU1005

    Number Sequence  HDU-1005 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  4. leetcode 217

    217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your ...

  5. leetcode 190

    190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 4326159 ...

  6. JUC.Condition学习笔记[附详细源码解析]

    目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Condition的数据结构 线程何时阻塞和释放 await()方法 ...

  7. Redis性能点

    AliRedis是来自阿里巴巴的基于Redis改造的缓存产品,目前还未开源.网上只能搜到这么一篇资料<AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群&g ...

  8. begin-end语句块在mysql中的使用问题

    在最近在通过navicate连接mysql数据库时,进行查询操作: delimiter $$BEGIN SET @a=1; if (@a > 0) THEN SELECT COUNT(*) fr ...

  9. 【初学者教程】在电脑上安装Python,写第一个程序

    欢迎来到Python的世界 1.存在Python 2和Python 3两个版本,我该用哪个?如果书是关于2的,下载2:如果书是关于3的,就下载3.建议用Python 3,不过用2也是可以的. 2.下载 ...

  10. python3.5-day5_迭代器_生成器_装饰器_模块

    笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...