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的更多相关文章

  1. nodejs复习02

    process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...

  2. nodeJs学习-02 fs模块(文件操作)

    读文件: const fs = require('fs'); //读文件(异步) readFile(文件名,回调函数) fs.readFile('section03/testData/aaa.txt' ...

  3. [Java 教程 02] 开发环境搭建

    在上一篇文章对Java做了一个简单介绍之后,我想大家都已经对她有一个初步的认识了吧!那踏入正式学习使用Java之前,我们有一步是不得不做的,它是什么呢?没有错,就是我们本篇文章的标题所说,搭建Java ...

  4. 模拟赛小结:2019-2020 ICPC, Asia Jakarta Regional Contest

    比赛链接:传送门 离金最近的一次?,lh大佬carry场. Problem A. Copying Homework 00:17(+) Solved by Dancepted 签到,读题有点慢了.而且配 ...

  5. nodejs学习总结02

    response对象常用的API #response对象 response  对象类型<http.ServerResponse> response对象常用成员:response.write ...

  6. 【NodeJS 学习笔记02】入门资源很重要

    前言 在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件...... 虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你 ...

  7. Nodejs in Visual Studio Code 02.学习Nodejs

    1.开始 源码下载:https://github.com/sayar/NodeMVA 在线视频:https://mva.microsoft.com/en-US/training-courses/usi ...

  8. 02 nodejs命令参数(NodeJS基础入门)

    声明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 建议使用开发软件:webstorm或hbuil ...

  9. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  10. [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM

    From: Predicting Movie Review Sentiment with TensorFlow and TensorBoard Ref: http://www.cnblogs.com/ ...

随机推荐

  1. BZOJ 4568 幸运数字

    题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...

  2. jQuery下拉菜单插件Tendina.

    插件效果: 下载地址和文档: https://github.com/iprignano/tendina

  3. POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)

      题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...

  4. WebService如何调试及测试工具

    http://www.cnblogs.com/zfanlong1314/archive/2012/04/06/2434788.html 通常,我们在Visual Studio里调试ASP.NET网站, ...

  5. New Features In SNMPv3 - SNMP Tutorial

    30.12 New Features In SNMPv3 We said that version 3 of SNMP represents an evolution that follows and ...

  6. Microsoft SQL Server 2008 R2官方中文版(SQL2008下载).rar

    Microsoft SQL Server 2008 R2官方中文版(SQL2008下载).rar

  7. Schema

    Schema约束 1.namespace 相当于schema文件的id 2.targetNamespace属性 用来指定schema文件的namespace的值 3.xmlns属性 引入一个约束,它的 ...

  8. MySql 杂记

    1:声明一个int变量时,设置它默认为0,而不是空或null. int 型,取值范围-2,147,483,648 到 2,147,483,647 ,默认值是 0 int是值类型,读内存区间中指定长度单 ...

  9. 生成彩条的MATLAB代码

    clc;close all;clear %read image % RGBimga = imread('bmpinput_1080p.bmp'); RGBimga = imread('bmpinput ...

  10. postgresql:pgadmin函数调试工具安装过程

    通过安装第三方插件pldebugger,可实现在pgadmin客户端对函数设置断点.调试,具体过程如下: 1.下载pldebugger安装包:http://git.postgresql.org/git ...