nodejs 笔记一

实现一个自动抓取Nodejs api 文档,用于本地查阅

目录结构:

一:抓取官网api列表

地址:http://nodeapi.ucdok.com/api/_toc.json

 1 //获取目录
 2 var http= require(‘http‘)
 3 var bufferhelper= require(‘./bufferhelper.js‘)
 4 var fs= require(‘fs‘)
 5 //获取目录
 6 http.get(‘http://nodeapi.ucdok.com/api/_toc.json‘,function(req){
 7     var _b = new bufferhelper()
 8     req.on(‘data‘,function(d){
 9         _b.concat(d)
10     })
11     req.on(‘end‘,function(){
12         getList(_b.toBuffer().toString(‘utf8‘))
13     })
14 }).on(‘error‘,function(e){
15     console.log(‘error:‘+e.message)
16 })
17
18 function getList(file){
19     var _sj=[];
20     var _j=JSON.parse(file);
21     _j.desc.forEach(function(item){
22         if(item.type==‘text‘){
23             _sj.push(item.text)
24         }
25     })
26     fs.writeFile(‘json/list.json‘, JSON.stringify(_sj), function (err) {
27         if (err) throw err
28         console.log(‘load ok‘)
29     })
30 } 

抓api列表

二:通过列表拿到具体的条目

 1 //通过目录下载子目录
 2 var http= require(‘http‘)
 3 var bufferhelper= require(‘./bufferhelper.js‘)
 4 var fs= require(‘fs‘)
 5
 6 fs.readFile(‘json/list.json‘,function(err,data){
 7     if(err) throw err;
 8     var _j=JSON.parse(data);
 9     _j.forEach(function(item){
10         var _url=item.match(/\([^\]]*\)/g);
11         var _s=_url[_url.length-1];
12         _s=_s.substr(1,_s.length-6);
13         getUrl(_s);
14     })
15 })
16 function getUrl(url){
17     http.get(‘http://nodeapi.ucdok.com/api/‘+url+‘json‘,function(req){
18         var _b = new bufferhelper()
19         req.on(‘data‘,function(d){
20             _b.concat(d)
21         })
22         req.on(‘end‘,function(){
23             getList(_b.toBuffer().toString(‘utf8‘),url)
24         })
25     }).on(‘error‘,function(e){
26         console.log(‘error:‘+e.message)
27     })
28
29 }
30
31 function getList(file,url){
32     fs.writeFile(‘json/list/‘+url+‘json‘, file, function (err) {
33         if (err) throw err
34         console.log(‘load ‘+url+‘json ok‘)
35     })
36 } 

子目录json

三:建个本地站点来展示拿到的数据。

1:写个web服务,简单实现,主要是能请求文件和请求方法。从网上找了两个文件,bufferhelper.js buffer辅助类,mine.js 处理请求文件格式

 1 var http = require(‘http‘);
 2 var url=require(‘url‘);
 3 var fs=require(‘fs‘);
 4 var mine=require(‘./mine‘).types;
 5 var config=require(‘./mine‘).config;
 6 var path=require(‘path‘);
 7
 8 var handle =function(request,response){
 9     var pathname = url.parse(request.url).pathname;
10     var realPath = path.join("./", pathname);
11     console.log(‘realPath:‘+realPath);
12     var ext = path.extname(realPath);
13     ext = ext ? ext.slice(1) : ‘unknown‘;
14     console.log(‘ext:‘+ext);
15
16     if(ext==‘unknown‘){
17         //realPath上一级为文件,最后为请求的方法名
18         var control=path.dirname(realPath);
19         var cpath=path.join("./",control+‘.js‘);
20         fs.exists(cpath,function(exists){
21             if (!exists) {
22                 response.writeHead(404, {
23                     ‘Content-Type‘: ‘text/plain‘
24                 });
25                 response.write("This request URL " + cpath + " was not found on this server.");
26                 response.end();
27             }else{
28                 var action=require(‘./‘+control)[path.basename(realPath)];
29                 try{
30                     action(request,response);
31                 }catch(err){
32                     var errMsg= ‘Error:‘+ new Date().toISOString() +‘‘+ request.url + err.stack || err.message || ‘unknow error‘;
33                     response.write(errMsg);
34                     response.end();
35                 }
36             }
37         });
38     }
39     else{
40         fs.exists(realPath, function (exists) {
41             if (!exists) {
42                 response.writeHead(404, {
43                     ‘Content-Type‘: ‘text/plain‘
44                 });
45                 response.write("This request URL " + pathname + " was not found on this server.");
46                 response.end();
47             } else {
48                 fs.readFile(realPath, "binary", function (err, file) {
49                     if (err) {
50                         response.writeHead(500, {
51                             ‘Content-Type‘: ‘text/plain‘
52                         });
53                         response.end(err);
54                     } else {
55                         var contentType = mine[ext] || "text/plain";
56                         response.writeHead(200, {
57                             ‘Content-Type‘: contentType +‘;charset=utf-8‘
58                         });
59                         response.write(file, "binary");
60                         response.end();
61                     }
62                 });
63             }
64         });
65     }
66 }
67
68 var server =http.createServer();
69 server.on(‘request‘,function(req,res){
70     try{
71         handle(req,res);
72     }catch(err){
73         var errMsg= ‘Error:‘+ new Date().toISOString() +‘‘+ req.url + err.stack || err.message || ‘unknow error‘;
74         console.error(errMsg);
75         res.end(errMsg);
76     }
77 });
78 server.listen(8888,‘127.0.0.1‘,function(){
79     console.log(‘listen: 127.0.0.1:8888‘);
80 });

2:webserver-start.cmd 用来启动服务,就一行代码

@echo off
node %cd%\webserver.js
pause

3:然后了,文件就down到本地了,做个简单页面测试下。这里用了下 window.onhashchange事件

 1 <body>
 2     <div id=‘main‘>
 3
 4     </div>
 5 </body>
 6 <script>
 7     $(function(){
 8         var h=window.location.hash;
 9         if(h!=‘‘){
10             getjson();
11             return;
12         }
13         getList();
14     });
15
16     window.onhashchange=function(e){
17         getjson();
18     };
19
20     function getjson(){
21         var h=window.location.hash;
22         if(h==‘‘){
23             getList();
24             return;
25         }
26         h=h.substr(1);
27         $.get(‘../json/list/‘+h+‘.json‘,function(j){
28             $(‘#main‘).empty().append(JSON.stringify(j));
29         });
30     }
31
32     function getList(){
33         $.get(‘../json/list.json‘,function(j){
34             var ul=$(‘<ul></ul>‘);
35             var list=‘‘;
36             j.forEach(function(item){
37                 var _url=item.match(/\([^\]]*\)/g);
38                 var _s=_url[_url.length-1];
39                 _s=_s.substr(1,_s.length-7);
40                 list+=‘<li><a href="#‘+_s+‘">‘+item+‘</a></li>‘;
41             });
42             ul.append(list);
43             $(‘#main‘).empty().append(ul);
44         });
45     }
46 </script>

大概先出个效果

作者:zc

出处:http://www.cnblogs.com/jmzs/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-10-09 23:29:14

nodejs 笔记一的相关文章

nodejs笔记01

昨天接触了nodejs: 2009年出来的 1.nodejs的优缺点 1>性能      有人测试是php的86倍(不知道真的假的) 2> 好学  与js的语法,对象,方法一样 3>前后台一样是js ,配合更方便 -------------------------- 1>缺少资料 2>对程序员要求更高 3>缺乏环境 2.  nodejs系统自带的模块: http (http协议的) ,fs (对文件的操作),net (比如socket) 第三方的模块mysql:   n

nodejs笔记2-http模块

nodejs 的模块的操作都是异步的:fs对文件的操作,... 1.引入http模块,require , createServer ,listen  .... code: // > node  http.js var http = require('http');//引入http模块var server = http.createServer(function(request,response){ console.log('welcome here'+request.url);//控制台  re

nodejs笔记2-mysql模块

1.mysql模块 不是nodejs的官方模块,是属于第三方的模块 > npm install mysql    //自动安装包括mysql模块依赖的其它的包 其实这安装的就是mysql的一个客户端, 2.  code: 返回的值: err 如果为null ,操作成功 ,否则失败, 操作成功返回的data数据 是object类型,需要使用 JSON.stringify(data)转换成json格式的字符串. var mysql = require('mysql');//引入http模块 var

nodejs 笔记

什么是REPL: Real-Eval-Print-Loop 可交互运行环境. 如何进入REPL模式: node 回车即可 .break (或者CTRL + C) .clear 清除上下文对象中保存的变量与函数 .save <file name> .load <file name> .exit (或者CTRL+C两次,或CTRL+D一次)或者 process.exit() 如何进入debug模式: node debug <script file> continue : c

Nodejs笔记(二)

Nodejs事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件. 所有这些产生事件的对象都是 events.EventEmitter 的实例.可以通过require("events")来访问该模块. EventEmitter 的用法: //event.js var EventEmitte

nodejs笔记--与MongoDB的交互篇(七)

原文地址:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html 目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mongo.exe客户端操作) 库操作 插入 查询 修改 删除 存储过程 nodejs操作MongoDB 插入 查询 修改 删除 调用存储过程 写在之后... 简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发

nodejs笔记简介

OPEN经验库Nodejs学习路线图:1.Nodejs介绍:2.15个Nodejs应用场景:3.Nodejs学习路线图 OPEN经验库七天学会NodeJS :1.Nodejs基础,安装,模块:2.代码的组织和部署:3.文件操作: 4.API简介: Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速,可扩展的网络应用程序的平台.Node.js使用事件驱动,非阻塞I/O模型,轻量.高效,可以完美地处理时时数据,运行在不同的设备上. Node的几大优势 1. Node

nodejs笔记--基础篇(一)

Sublime Node.js开发环境配置 下载并安装Node.js安装包后再开始配置 1.先安装好Sublime Text 2 2.运行Sublime,菜单上找到Tools ---> Build System ---> new Build System 3.在文件中复制入 { "cmd": ["node", "$file"], "file_regex": "^[ ]*File \"(...*?

nodejs笔记--express篇(五)

创建一个express + ejs的项目 express -e testEjsWebApp cd testEjsWebApp npm install http://localhost:3000 Usage: express [options] [dir] Options: -h, --help output usage information -V, --version output the version number -e, --ejs add ejs engine support (def