node

sublime配置安装

EventEmitter 提供了多个属性,如 on 和 emiton 函数用于绑定事件函数,emit 属性用于触发一个事件。

 

Buffer类:

  javaScript只有字符串数据类型,没有二进制。处理TCP流或者文件流时,需要二进制数据,所以定义了Buffer类,作为专门存放二进制数据的缓存区。

用一下功能,并没有测试对错
var a = new BUffer(50).write("hello doubi", 0, 12, 'utf8');
var b = a.toString('utf8', 1, 3);
var c = buf.toJSON(Buffer.concat(a, b));
var d = a.compare(b);
var e = buf.copy(a, 1, 1, 2);
slice length..

 

Stream:抽象接口,比如对http服务器发起请求的Request对象,比如stdout。

      Stream有可读操作、可写操作、可读可写操作、操作被写入数据读出结果四种流类型。

     都是EventEmitter的实例,常见事件有data、end、error、finish四种事件

     eg:createReadStream、createWriteStream、createGzip、createGunzip

 

模块: 使文件相互调用,使nodejs的基本组成,模块与文件一一对应,比如js文件、json、编译过的c/c++扩展

//注意引用一致
var a = require('./hello');
hello = new a();

两种用法

提供访问接口
hello.js:
exports.Hello = function(){};
test1.js:
require('hello').hello();

提供封装对象
hello.js
Hello = function(){};
module.exports = hello;
test1.js:
var a = require('./hello');
var b = new Hello();

模块加载优先级:读缓存 > 读原生模块 > 读扩展名载入文件模块(包装编译,读取后载入缓存)

 函数:

1、实现函数、接口函数,调用
function say(str) {
  console.log(str);
}

function execute(func, value) {
  func(value);
}
execute(say, "Hello");


2、接口函数匿名,当场调用
function excute(func, val){
   func(val);
};

excute(function(str) {
   console.log(str);
}, 'hello');

 路由router:

比较难懂待完成

向路由提供请求的URL和GET及POST参数,
路由据此执行代码。
所有数据包含在request对象中,也即onRequest()回调函数的第一个参数。
解析数据,用到url和querystring模块。

                     url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]

 Global全局对象:

//1
console.log( __filename);
console.log( __dirname);

function Hello() {
    console.log("hi world!");
}

console.time("在我弟盼着");
Hello();
console.timeEnd("在我弟盼着");
console.info("程序结束\n");

console.trace();//打印堆栈消息
// console.assert(false, "hehe");

//2
/*exit beforeExit uncaughtException Signal 
退出状态码:1 Uncaught Fatal Exception 2 Unused*/
process.on('exit', function(code) {

  // 以下代码永远不会执行
  setTimeout(function() {
    console.log("该代码不会执行");
  }, 0);
  
  console.log('退出码为:', code);
});
console.log("程序执行结束");

//3 
/*Process属性:stdout stderr stdin argv execPath execArgv env
exitCode version versions config pid title arch platform mainModule*/
process.stdout.write("hell guys\n");
process.argv.forEach( function(val, index, array) {
    console.log(index + ": " + val);
})

console.log(process.execPath);

console.log(process.mainModule);

//4
/*abort chdir cwd exit getgid setgid getuid setuid getgroups 
setgroups initgroups kill memoryUsage nextTick umask uptime hrtime*/
// 输出当前目录    
console.log('当前目录: ' + process.cwd());

// 输出当前版本
console.log('当前版本: ' + process.version);

// 输出内存使用情况
console.log(process.memoryUsage());
View Code

 

util:常用工具

util.inherits(sub, base)
Sub仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的属 性和函数没有被继承。

util.inspect(pes, true)
将对象转换为字符串,可以查看结构

isArray isRegExp isDate isError
View Code

 fs:文件系统

文件系统

var fs = require("fs");

fs.readFile('input.txt', function(err, data){}});

fs.readFileSync('input.txt'));

fs.open(path, flags[, mode], callback)

fs.stat(path, callback)判断是否是。。
//tats.isFile()  isDirectory  isSocket

fs.writeFile(filename, data[, options], callback)
//options包含 {encoding, mode, flag}。默认为utf8,0666,'w'

fs.ftruncate(fd, len, callback)

fs.unlink(path, callback)

mkdir readdir rmdir rename ftruncate ftruncateSync
chown  access用户权限
View Code

get/post

var http = require('http');
var url = require('url');
var util = require('util');

http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);

/*http://localhost:3000/user?name=w3c&email=w3c@w3cschool.cc
  Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?name=w3c&email=w3c@w3cschool.cc',
  query: { name: 'w3c', email: 'w3c@w3cschool.cc' },
  pathname: '/user',
  path: '/user?name=w3c&email=w3c@w3cschool.cc',
  href: '/user?name=w3c&email=w3c@w3cschool.cc' }*/

  http.createServer(function(req, res){
    var post = '';     //定义了一个post变量,用于暂存请求体的信息

    req.on('data', function(chunk){    //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
        post += chunk;
    });

    req.on('end', function(){    //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
        post = querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(3000);
View Code

nodejs工具模块

var os = require("os")
os.tmpdir endianness hostname type platform arch release
uptime loadavg totalmem freemem cpus networkInterfaces

var path = require("path")
normalize join resolve isAbsolute relative dirname 
basename extname parse format

domain模块: 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常
把不同的IO操作作为一个组,注册时间会掉到domain,发生错误或者抛出一个错误,domain对象会被通知,不会丢失上下文环境,也不导致错误立即推出。
domain.create add remove run(隐式绑定) dispose eixt  bind intercept enter members

var dns = require("dns")
var dns = require("dns");

dns.lookup('www.github.com', function onLookup(err, address, family) {
    console.log('ip 地址:', address);
    dns.reverse(address, function (err, hostnames) {
        if (err) {
            console.log(err.stack);
        } else {
            console.log('反向解析' + address +":" + JSON.stringify(hostnames));
        }
    })
});

lookup lookupService resolve resolve4 reverse解析 getServers resolveTxt resolveSoa resolveNs
View Code

 

 

4、多进程
  Nodejs单线程运行,事件驱动利于多cpu多进程,提高性能。每个子进程有child.stdin,child,stdout,child.stderr。Node提供了child_process创建子进程,方法有exec(使用子进程执行命令,缓存子进程输出)、spawn(使用指定命令行参数创建新进程)、fork(spawn的特殊形式)

child_process.exec(command[, options], callback)

//support.js
console.log("进程 " + process.argv[2] + " 执行。");

//master.js
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js ' +i, errStdout);

   workerProcess.on('exit', function(code) {
      console.log('子进程已退出,退出码 ' + code);
   })
};

function errStdout(error, stdout, stderr) {
   if(error) {
      console.log(error.stack());
      console.log('Error code: ' + error.code);
      console.log('Signal received: ' + error.signal);
   } else {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   }
};
View Code

 child_process.spawn(command[, args][, options])

spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。

//master.js
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function(data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function(data) {
      console.log('stderr:' + data);
   })

   workerProcess.on('close', function(code) {
      console.log('子进程已退出,退出码 ' + code);
   })
};
View Code

 child_process.fork(modulePath[, args][, options])

//master.js
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.fork('test1.js', [i]);

   workerProcess.on('close', function(code) {
      console.log('子进程已退出,退出码:' + code);
   })
};
View Code

 

3、Express框架
npm install express --save
//node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
body-parser
//这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
 cookie-parser
中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
npm install multer --save

app.get('/', function (req, res) {
   // --
})

request 和 response 对象的具体介绍:
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
req.app:当callback为外部文件时,用req.app访问express的实例
req.baseUrl:获取路由当前安装的URL路径
req.body / req.cookies:获得「请求主体」/ Cookies
req.fresh / req.stale:判断请求是否还「新鲜」
req.hostname / req.ip:获取主机名和IP地址
req.originalUrl:获取原始请求URL
req.params:获取路由的parameters
req.path:获取请求路径
req.protocol:获取协议类型
req.query:获取URL的查询参数串
req.route:获取当前匹配的路由
req.subdomains:获取子域名
req.accpets():检查请求的Accept头的请求类型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
req.get():获取指定的HTTP请求头
req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
res.app:同req.app一样
res.append():追加指定HTTP头
res.set()在res.append()后将重置之前设置的头
res.cookie(name,value [,option]):设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():传送指定路径的文件
res.get():返回指定的HTTP头
res.json():传送JSON响应
res.jsonp():传送JSONP响应
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.send():传送HTTP响应
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型
View Code

 router路由指定脚本响应客户端要求

var express = require("express");
var app = express();

app.get('/', function (req, res) {
   console.log("主页 GET 请求");
   res.send('Hello GET');
})

//can't
app.post('/', function (req, res) {
    console.log("主页post请求");
    res.send("helo post");
})

//can't
app.delete('/del_user', function (req, res) {
    console.log('delete请求');
    res.send('删除页面');
})

app.get('/list_user', function (req, res) {
    console.log('listusers 请求');
    res.send('用户列表页面');
})

app.get('/ab*cd', function (req, res) {
    console.log('get请求');
    res.send('正则匹配');
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})
View Code

Express的内置中间件express.static来设置静态文件

//http://127.0.0.1:8081/image/logo.png
app.use(express.static('public'));
View Code

get方法

//index.htm
<html>
<body>
<form action="http://127.0.0.1:8081/process_get" method="GET">
First Name: <input type="text" name="first_name">  <br>

Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>

//test1.js
var express = require('express');
var app = express();

//http://127.0.0.1:8081/image/logo.png
app.use(express.static('public'));

app.get('/', function (req, res) {
    res.send('hello world');
})

app.get('/index.htm', function (req, res) {
    //sendFile是文档流吗
    res.sendFile( __dirname + '/' + 'index.htm');
})

app.get('/process_get', function (req, res) {
    
    //输出JSON格式
    response = {
        firse_name:req.query.first_name,
        last_name:req.query.last_name
    }
    console.log(response);
    res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})
View Code

post方法

//index.htm
<html>
<body>
<form action="http://127.0.0.1:8081/process_post" method="POST">
First Name: <input type="text" name="first_name">  <br>

Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>

//test1.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');

var urlencodedParser = bodyParser.urlencoded({ extended: false});

//http://127.0.0.1:8081/image/logo.png
app.use(express.static('public'));

app.get('/', function (req, res) {
    res.send('hello world');
})

app.get('/index.htm', function (req, res) {
    //sendFile是文档流吗
    res.sendFile( __dirname + '/' + 'index.htm');
})

app.post('/process_post', urlencodedParser, function (req, res) {
    
    //输出JSON格式
    response = {
        first_name:req.body.first_name,
        last_name:req.body.last_name
    }
    console.log(response);
    res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})
View Code

upload

//有问题会报错还需调试
//index.htm
<html>
<body>
<h3>文件上传:</h3>
选择一个文件上传:<br/>
<form action="/file_upload" method="POST" unctype="multipart/form-data">
<input type="file" name="image" size="50"/><br/>
<input type="submit" name="上传文件">
</form>
</body>
</html>

///

var express = require('express');
var app = express();
var fs = require("fs");
var bodyParser = require('body-parser');
var multer = require("multer");

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false}));
app.use(multer({ dest: '/tmp/'}).array('image'));

app.get('/index.htm', function (req, res) {
    //sendFile是文档流吗
    res.sendFile( __dirname + '/' + 'index.htm');
})

app.post('/file_upload', function (req, res) {
    console.log(req.files[0]);    //上传的文件信息

    var des_file = __dirname + '/' + req.files[0].originalname;
    fs.readFile( req.files[0].path, function (err, data) {
        fs.writeFile(des_file, data, function (err) {
            if (err) {
                console.log(err);
                res.end(err);
            } else {
                response = {
                    message: 'File uploaded successfully',
                    filename:  req.files[0].originalname 
                };
                console.log(response);
                res.end(JSON.stringify( response ));
            }
        })
    });
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})
View Code

 cookies

//可能有问题,没整明白
var express = require("express")
var cookieParser = require("cookie-parser")

var app = express()
app.use(cookieParser)

app.get('/a', function (req, res) {
    console.log("Cookies:", req.cookies)
})

app.listen(8081)
View Code

2、REST

  RESTful API(Representational State Transfer表述性状态传递),REST通常基于使用HTTP,URI,XML以及HTML这些广泛流行的协议和标准,通常使用JSON数据格式。
  四个方法:  get获取~数据     put添加~      delete删除~      post更新或添加~

//server.js
//RESTful API @fanyu20160620
//问题没解决:1、deleteUser无法注册 2、新增可以显示,但是没有实际更新

/*序号    URI            HTTP方法    发送内容    结果
    1    listUsers    GET            空            显示所有用户列表
    2    addUser        POST        JSON字符串    添加新用户
    3    deleteUser    DELETE        JSON字符串    删除用户
    4    :id            GET            空            显示用户详细信息*/
var express = require('express');
var app = express();
var fs = require("fs");

//添加新用户1/2
var user = {
    "user4": {
        "name" : "miaomiaoTobe",
        "password" : "password1",
        "profession" : "Web Representation",
        "id" : 4
    }
};

//添加新用户 /addUser
app.get('/addUser', function(req, res) {
    fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) {
        
        data = JSON.parse(data);
        console.log(data);
        data['user4'] = user["user4"];
        
        res.end(JSON.stringify(data));
        console.log(data);
    });
});

//显示所有用户列表 /listUsers
app.get('/listUsers', function(req, res) {
    fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) {
        console.log(data);
        res.end(data);
    });
});

//显示用户详细信息 /2
app.get('/:id', function (req, res) {
    fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) {
        data = JSON.parse(data);
        
        var user = data["user" + req.params.id];
        console.log(JSON.stringify(user));
        res.end(JSON.stringify(user))
    });
});

//删除用户/deleteUser
app.get('/deleteUser', function (req, res) {
    fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) {
        data = JSON.parse(data);

        delete data["user" + 2];
        console.log(data);
        res.end( JSON.stringify(data) );
    });
});

//监听8081端口
var server = app.listen(8081, function() {
    var host = server.address().address;
    var port = server.address().port;

    console.log("应用实例,访问地址为 http://%s:%s", host, port);
});

//users.json
{
    "user1": {
        "name" : "miaomiao1",
            "password" : "password1",
            "profession" : "teacher",
            "id" : 1
    },
    "user2": {
        "name" : "miaomiao2",
            "password" : "password2",
            "profession" : "librarion",
            "id" : 2
    },
    "user3": {
        "name" : "miaomiao3",
            "password" : "password3",
            "profession" : "clerk",
            "id" : 3
    }
}
View Code

1、JXcore 打包

  nodejs是开放源代码,跨平台、用于服务器端和网络应用的运行环境。JXcore是一个支持多线程的Nodejs发行版本,基本不需要对现有代码任何改动就能线程安全的多线程运行。http://0x9.me/pcj8E

posted @ 2016-06-16 17:27  miaomiaotab  阅读(221)  评论(0编辑  收藏  举报