打算学之前被朋友推荐看了《了不起的nodejs》,看到60多页看不下去了,基础和原理讲的很细,我觉得对初期学习不是很有利,好比我想学习“大象”是何物,这本书先开始将大象是如何让进化而来,始祖是哪种动物,画了一只大象简图“hello world!”。接着从大象的鼻子开始讲起,鼻子什么样,鼻子是由什么构成的,它用来干什么。。。看到眼睛我看不太下去了,因为我始终看不到活灵活现的大象,我还是不知道大象是什么,我停在了那句“hello world!”
不怪作者,我脑路太扩散。此时我希望来部大象主题的记录片我就会立马懂了大体什么样。《了不起的nodejs》应该后期再钻研才对
这里我只当给自己的笔记
开始:
Node.js 文件系统
读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
var fs = require("fs");
有很多用法,如何打开文件,读写文件,删除文件,打开目录,读取文件字符。。。
Node.js 常用工具
var util = require('util');
util.inherits(Sub, Base); 对象syb继承Base对象方法
util.inspect(obj);将任意对象转换 为字符串的方法
util.isArray(object);是一个数组返回true,否则返回false。
util.isDate(object); "object" 是一个日期返回true,否则返回false。
......
EventEmitter 类
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
用on注册了两个两个事件监听器,emit触发了 someEvent 事件
还有其他listenerCount等方法
querystring
querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析。querystring模块只提供4个方法,在我看来,这4个方法是相对应的。
这4个方法分别是querystring.parse和querystring.stringify,querystring.escape和querystring.unescape。
querystring.parse("name=whitemu#sex=man#sex=women","#",null,{maxKeys:2});
return:
{ name: 'whitemu', sex: 'man' }
querystring.stringify({name: 'whitemu', sex: [ 'man', 'women' ] });
'name=whitemu&sex=man&sex=women'
url.parse
url一共提供了三个方法,分别是url.parse(); url.format(); url.resolve();
parse这个方法可以将一个url的字符串解析并返回一个url的对象
url.parse("http://user:pass@host.com:8080/p/a/t/h?query=string#hash");
返回值:
{
protocol: 'http:',
slashes: true,
auth: 'user:pass',
host: 'host.com:8080',
port: '8080',
hostname: 'host.com',
hash: '#hash',
search: '?query=string',
query: 'query=string',
pathname: '/p/a/t/h',
path: '/p/a/t/h?query=string',
href: 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'
}
url.format()与之相反
req的方法
nodejs用req.on('data',fn)接收客户端的数据;
nodejs用req.on('end',fn)结束响应,告诉客户端所有消息已经发送。当所有要返回的内容发送完毕时,该函数必须被调用一次。
如何不调用该函数,客户端将永远处于等待状态。
Node.js GET/POST请求
这个例子就可以,有些语句不懂的上文有解释
image.png
var http = require('http');
var querystring = require('querystring');
var postHTML =
'<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +
'<body>' +
'<form method="post">' +
'网站名: <input name="name"><br>' +
'网站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
// 解析参数
body = querystring.parse(body);
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
if(body.name && body.url) { // 输出提交的数据
res.write("网站名:" + body.name);
res.write("<br>");
res.write("网站 URL:" + body.url);
} else { // 输出表单
res.write(postHTML);
}
res.end();
});
}).listen(3000);
开始express框架的学习
这四句搞进去!
body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
npm install body-parser --save
npm install multer --save
bodyParser
app.use(bodyParser.urlencoded({ extended: false }));
顾名思义,bodyParser.json是用来解析json数据格式的。bodyParser.urlencoded则是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded
urlencoded解析body中的urlencoded字符, 只支持utf-8的编码的字符,也支持自动的解析gzip和 zlib,
上传文件
var express = require('express');
var fs = require('fs');
var app = express();
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.html',function (req,res) {
res.sendFile(__dirname + "/" + "index.html");
});
app.post('/flie_upload',function (req,res) {
console.log(req.files[0]);
// { fieldname: 'image',
// originalname: '2018-05-08_103026.png',
// encoding: '7bit',
// mimetype: 'image/png',
// destination: '/tmp/',
// filename: '04a8a5f92a3db4c2396ac83beb87fcd4',
// path: '\\tmp\\04a8a5f92a3db4c2396ac83beb87fcd4',
// size: 1675439 }
var des_flie = __dirname + "/"+req.files[0].originalname;
fs.readFile(req.files[0].path,function (err,data) {
fs.writeFile(des_flie,data,function (err) {
if(err){
console.log(err);
}else{
response = {
message:'file upload successfully',
filename:req.files[0].originalname
}
}
res.end(JSON.stringify(response));
});
});
console.log(des_flie);
});
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
fs.writeFile(file, data[, options], callback);
writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
file - 文件名或文件描述符。
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
网友评论