nodejs review-02
30 Receive POST data
POST接受JSON数据处理;
//req. res都是可读的stream;
http.createServer(function (req, res) {
var json_data = '';
req.on('readable', function () {
var d = req.read();
if(typeof d === 'string') {
json_data += d;
} else if(typeof d === 'object' && d instanceof Buffer) { //可以简化使用Buffer.isBuffer/util.isBuffer判断;
json_data += d.toString('utf8');
}
});
req.on('end', function () {
var out = '';
if(!json_data) {
out = 'No JSON';
} else {
var json;
try {
json = JSON.parse(json_data); //判断是否为字符串化的JSON数据
} catch(e) {}
if(!json) out = 'Invalid JSON';
else out = 'Valid Data JSON: ' + json_data;
}
res.end(out);
});
}).listen(3000);
//curl的post
curl -i -X POST -H 'Content-Type: application/json' -d '{"name": "jinks" , "age": 25}' http://localhost:3000
POST接受query处理
var qs = require('querystring');
...
req.on('end', function () {
var out = '';
if(!form_data) {
out = 'No JSON';
} else {
var json = qs.parse(form_data);
if(!json) out = 'Invalid form_data';
else out = 'Valid Data form_data: ' + JSON.stringify(json);
}
res.end(out);
});
...
//--data 即 -d
curl -i -X POST --data 'name=jinks&age=25' http://localhost:3000
- 处理查询字符串的注意:如果同一个键有多个值,其值会以数组形式返回,实际业务中需要做判断
32 Use npm the node package manager
npm查找包
npm search
npm全局安装的地方/nodejs最底层查找包的地方;
/usr/local/lib/node_modules
- 包映射
npm link; //允许后将当前包映射到/usr/local/lib/node_modules中,每次当前包变化,相应机会变化;
npm link package; //可以将/usr/local/lib/node_modules中的包映射到当前node_modules中,也会相应变化;
37 Investigate Node js streams
- 读取数据流
var ws = fs.createWriteStream('test.js');
function read_file(filename, callback) {
var rs = fs.createReadStream(filename);
var content = '';
rs.on('readable', function () {
var d = rs.read();
if(typeof d === 'string') {
content += b;
} else if(Buffer.isBuffer(d)) {
content += d.toString('utf8')
}
});
rs.on('end', function () {
callback(null, content);
});
};
read_file('example.txt', function (err, contents) {
if(err) return console.log(err);
return ws.write(contents);
});
//扩展
//1.使用data事件取代readable
rs.on('data', function (chunk) {
content += chunk.toString('utf8');
});
//2.将全部读取完后写入改成边写边读
function read_file(filename, callback) {
var rs = fs.createReadStream(filename);
var content = '';
rs.on('data', function (chunk) {
ws.write(chunk) === false && rs.pause();
});
rs.on('end', function () {
ws.end();
});
ws.on('drain', function () {
rs.resume();
});
rs.on('err', function () {
callback(err);
});
ws.on('err', function () {
callback(err);
});
};
//3.使用pipe
fs.createReadStream('example.txt')
.pipe(fs.createWriteStream('copy.txt'))
.on('error', function () {});
string,buffer的长度关系
var b = new Buffer(100);
var s = 'string';
b.write(s);
console.log(s.length, b.length, Buffer.byteLength(s)); //6, 100, 6
var b2 = new Buffer(100);
var c = '字符串';
b2.write(c);
console.log(c.length, b2.length, Buffer.byteLength(c)); //3, 100, 9
38 Serve static files from our server
server中使用数据库
http.createServer(function (req, res) {
var rs = fs.createReadStream('example.txt');
rs.on('error', function (err) {
res.writeHead(404);
res.end(JSON.stringify(err));
})
.on('open', function () {
res.writeHead(202);
})
.on('data', function (chunk) {
res.write(chunk) === false && rs.pause();
})
.on('drain', function () {
rs.resume();
})
.on('end', function () {
res.end();
});
}).listen(3000);
//
http.createServer(function (req, res) {
var rs = fs.createReadStream('example.txt');
rs.on('error', function (err) {
res.writeHead(404);
res.end(JSON.stringify(err));
});
rs.on('open', function () {
res.writeHead(202);
});
rs.pipe(res);
}).listen(3000);
Buffer类型的处理
//
var fs = require('fs');
var rs = fs.createReadStream('example.txt');
var data = '';
rs.on("data", function (chunk){
data += chunk; //隐藏操作data = data.toString() + chunk.toString();
});
rs.on("end", function () {
console.log(data);
});
//对于中文处理
rs.setEncoding('utf8'); //初始化声明;而然存在问题
//Buffer拼接
var chunks = [], size = 0;
res.on('data', function (chunk) {
chunks.push(chunk);
size += chunk.length;
};
res.on('end', function () {
var buf = Buffer.concat(chunks, size); //省略第二个参数时,Node内部会计算出这个值,然后再据此进行合并运算。因此,显式提供这个参数,能提供运行速度。
console.log(buf.toString('utf8'));
});
//相当于
res.on('end', function () {
var buffer = new Buffer(size), pos = 0;
for(var i = 0, l = chunks.length; i < l; i++) {
var buf = chunks[i];
buf.copy(buffer, pos);
pos += buf.length;
};
console.log(buffer.toString('utf8'));
});
nodejs review-02的更多相关文章
- nodejs复习02
process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...
- nodeJs学习-02 fs模块(文件操作)
读文件: const fs = require('fs'); //读文件(异步) readFile(文件名,回调函数) fs.readFile('section03/testData/aaa.txt' ...
- [Java 教程 02] 开发环境搭建
在上一篇文章对Java做了一个简单介绍之后,我想大家都已经对她有一个初步的认识了吧!那踏入正式学习使用Java之前,我们有一步是不得不做的,它是什么呢?没有错,就是我们本篇文章的标题所说,搭建Java ...
- 模拟赛小结:2019-2020 ICPC, Asia Jakarta Regional Contest
比赛链接:传送门 离金最近的一次?,lh大佬carry场. Problem A. Copying Homework 00:17(+) Solved by Dancepted 签到,读题有点慢了.而且配 ...
- nodejs学习总结02
response对象常用的API #response对象 response 对象类型<http.ServerResponse> response对象常用成员:response.write ...
- 【NodeJS 学习笔记02】入门资源很重要
前言 在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件...... 虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你 ...
- Nodejs in Visual Studio Code 02.学习Nodejs
1.开始 源码下载:https://github.com/sayar/NodeMVA 在线视频:https://mva.microsoft.com/en-US/training-courses/usi ...
- 02 nodejs命令参数(NodeJS基础入门)
声明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 建议使用开发软件:webstorm或hbuil ...
- node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...
- [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM
From: Predicting Movie Review Sentiment with TensorFlow and TensorBoard Ref: http://www.cnblogs.com/ ...
随机推荐
- Javascript:一个屌丝的逆袭
HTML负责结构, CSS负责展示, 而我(加上AJAX, JSON) 负责逻辑.于是前端编程三剑客形成了. http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExN ...
- 今天在学习NTP时发现了2个网站
NTP 调整系统时间 一个网站是:http://chrony.tuxfamily.org/doc/1.31/manual.html 这个是专门介绍chrony的,做的很详细. 另外一个是:http: ...
- PHP开发程序应该注意的42个优化准则
PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...
- PHP变量入门教程(2)超全局变量,总共9个
PHP 超全局变量 $GLOBALS 包含一个引用指向每个当前脚本的全局范围内有效的变量.该数组的键标为全局变量的 名称.从 PHP 3 开始存在 $GLOBALS 数组. $_SERVER 变量由 ...
- PHP变量入门教程(4)PHP 的外部变量
PHP 的外部变量 HTML 表单(GET 和 POST) 当一个表单体交给 PHP 脚本时,表单中的信息会自动在脚本中可用.有很多方法访问此信息,例如: 一个简单的 HTML 表单 <form ...
- Vundle的安装
1.Vundle.vim 安装 https://github.com/VundleVim/Vundle.vim 2.插件安装https://github.com/yangyangwithgnu/use ...
- css特殊字符总结
< : < > : >
- jquery版小型婚礼(可动态添加祝福语)
前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我的百度生涯,一直寻觅许愿墙背景图片和便利贴图片,觅了好久……一直没找到满意的……无意间看到祝福语和一些卡通婚礼图片.最 ...
- PHP array 操作函数
array_map 函数的介绍 将数组的每个单元使用回调函数格式: array_map(callback, array) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- C++代码重构——从C global到C++ template
在学数据结构的时候,我常有这样目标--写出能够最大程度复用的代码(算法正确,封装优秀).我常想--如何能在短时间内达成"算法正确,封装优秀"这样的目标.经过一段时间的摸索,我的结论 ...