文件操作

  • 文件系统的操作

    * fs.readFile(filename, [options], callback)

    * fs.writeFile(filename, data, [options], callback)
//同步
fs.writeFileSync('data/' + dist, fs.readFileSync(src));
//异步
fs.readFile(src, function (err, data) {
if (err) {
throw err;
} else {
fs.writeFile(dist, data, function (err) {
if (err) throw err;
})
}
});
  • 数据流操作

    • fs.createReadStream(path, [options]),
    • fs.createWriteStream(path, [options])
//使用pipe
fs.createReadStream(src).pipe(fs.createWriteStream('./data/' + dist));
//
var rs = fs.createReadStream(src);
var ws = fs.createWriteStream(dist);
rs.on('data', function (chunk) {
if (ws.write(chunk) === false) {
//判断写入还是缓存
rs.pause();
}
});
rs.on('end', function () {
ws.end();
});
ws.on('drain', function () {
//已经写入的话继续
rs.resume();
});

fs内置模块常用api

  • 文件属性读写

    * fs.stat //获取文件信息

    * fs.chown //更改文件所有权

    * fs.chmod //改写文件的读写权限
  • 文件内容读写

    * fs.readFile

    * fs.readdir

    * fs,writeFile

    * fs.mkdir
  • 底层文件操作

    * fs.open

    * fs.read

    * fs.close

    * fs.unlink

读取文件

  • 使用fs.readStream读取文件;
var http = require('http');
var path = require('path');
var fs = require('fs');
var url = require('url'); var mimeTypes = {
'.js' : 'text/javascript',
'.html': 'text/html',
'.css' : 'text/css'
}; //设置白名单
var whitelist = [
'/index.html',
'/style.css',
'/script.js'
]; var cache = {
store: {},
maxSize : 26214400, //(bytes) 25mb
maxAge: 5400 * 1000, //(ms) 1 and a half hours
clearnAfter: 7200 * 1000,//(ms) two hours
cleanedAt: 0, //to be set dynamically
clean: function (now) {
if (now - this.cleanAfter > this.cleanedAt) {
this.cleanedAt = now;
var maxAge = this.maxAge;
Object.keys(this.store).forEach(function (file) {
if (now > this.store[file].timestamp + maxAge) {
delete this.store[file];
}
}.bind(this));
}
}
}; http.createServer(function (req, res) {
if (req.url === '/favicon.ico') return;
var lookup = url.parse(decodeURI(req.url)).pathname;
lookup = path.normalize(lookup);
lookup = (lookup === '/') ? '/index.html' : lookup; if (whitelist.indexOf(lookup) === -1) {
res.writeHead(404);
return res.end('Page Not Found!');
} var f = './public' + lookup;
console.log(f);
fs.exists(f, function (exists) {
if (exists) {
var headers = {'Content-Type': mimeTypes[path.extname(lookup)]};
if(cache.store[f]) {
res.writeHead(200, headers);
return res.end(cache.store[f].content);
}
var s = fs.createReadStream(f).once('open', function () {
res.writeHead(200, headers);
this.pipe(res);
}).once('err', function (err) {
console.log('err:', e);
res.writeHead(500);
return res.end('Server Error!');
}); //对输出流保存cache处理;设置buffer需要大小,使用fs.stat获取
return fs.stat(f, function (err, stats) {
if (stats.size < cache.maxSize) {
var bufferOffset = 0;
cache.store[f] = {content: new Buffer(stats.size), timestamp: Date.now()}; s.on('data', function (chunk) {
chunk.copy(cache.store[f].content, bufferOffset);
bufferOffset += chunk.length; //大小设置
})
} });
} res.writeHead(404);
return res.end('Not find Source!');
});
//清除超出时间的缓存
cache.clean(Date.now());
}).listen(3000);
  • 使用fs.readFile读取文件
var http = require('http');
var path = require('path');
var fs = require('fs'); var mimeTypes = {
'.js' : 'text/javascript',
'.html': 'text/html',
'.css' : 'text/css'
};
var cache = {}; function cacheAndDeliver (f, cb) {
fs.stat(f, function (err, stats) {
if (err) return console.log('Error: ',err);
var lastChanged = Date.parse(stats.ctime);
var isUpdated = cache[f] && lastChanged > cache[f].timestamp;
if (!cache[f] || isUpdated) {
fs.readFile(f, function (err, data) {
if (!err) cache[f] = {content: data, timestamp: Date.now()}; //store a Unix time stamp
cb(err, data);
});
return;
}
console.log('loading ' + f + ' from cache');
return cb(null, cache[f].content);
})
}; http.createServer(function (req, res) {
if (req.url === '/favicon.ico') return;
var lookup = path.basename(decodeURI(req.url)) || 'index.html';
var f = './public/' + lookup;
fs.exists(f, function (exists) {
if (exists) {
cacheAndDeliver(f, function (err, data) {
if (err) {
res.writeHead(500);
res.end('Server Error!');
return;
}
var headers = {'Content-Type': mimeTypes[path.extname(lookup)]};
res.writeHead(200, headers);
res.end(data);
});
return; //注意return的位置
}
res.writeHead(404);
return res.end('Not find Source!');
})
}).listen(3000);

路径处理

  • url路径处理:

    * url.parse(req.url).pathname; url.parse(req.url, true).query

  • 文件路径处理:

    * path.join(__dirname, pathname);

path.dirname('/foo/bar/baz/asdf/quux')      '/foo/bar/baz/asdf'
//
path.basename('/foo/bar/baz/asdf/quux.html') 'quux.html'
path.basename('/foo/bar/baz/asdf/quux.html', '.html') 'quux'
//
path.extname('index.coffee.md') '.md'
path.extname('index.') '.'
path.extname('index') ''
path.extname('.index') ''
  • 递归一个文件夹例子
function travelS(dir, cb) {
fs.readdirSync(dir).forEach(function (file) {
var pathname = path.join(dir, file);
if (fs.statSync(pathname).isDirectory()) {
travelS (pathname, callback);
} else {
callback(pathname);
}
})
};

process

事件

  • process.on('exit', function(){});
  • process.on('uncaughtException', function(){});
  • 信号事件: :SIGINT,SIGUSR1...
    • 一个简单的方式发送SIGINT信号的方法是:control-c

方法

  • process.uptime(): Node的运行时间;
  • process.nextTick(func): 将函数放到后面运行;
  • process.cwd(): 显示当前文件夹目录;
  • process.exit(code): 退出进程,内部调用进程的exit事件,code:0表示成功退出,1表示失败退出;
  • process.kill(pid[, signal])#: 退出进程, 触发第二参数,为SIGINT,SIGHUP

属性

  • process.env: 运行环境参数;
  • process.stdin: 输入流;
    • process.stdin.resume();: 开启输入流,调用一次后程序不会马上停止;
    • process.stdin.setEncoding('utf8')
  • process.stdout: 输出流;
process.stdin.resume();
process.stdin.pipe(process.stdout);
  • process.stderr: 错误流;
  • process.pid: 进程的pid

数据交互

上传数据常用类型

  • application/x-www-form-urlencoded;
  • application/json;
  • application/xml;
  • multipart/form-data;

JSONP

//client
var who = 'ryan';
function cb(o) {
alert(o.name + ' : ' + o.description);
}
var s = document.createElement('script');
s.src = 'http://localhost:3000/?callback=cb&who=' + who;
document.getElementsByTagName("head")[0].appendChild(s); //server
var profiles = require("./profiles.json");
.....
if(cb && who) {
profile = cb + '(' + JSON.stringify(profiles[who]) + ')';
return res.end(profile);
}

上传文件例子

var http = require('http');
var formiable = require('formidable');
var fs = require('fs'); var form = require('fs').readFileSync('./public/form-upload.html'); http.createServer(function (req, res) {
if (req.method === 'GET') {
res.writeHead(200, {'Content-Type': 'text/html'});;
return res.end(form);
} if (req.method === 'POST') {
var incoming = new formiable.IncomingForm();
var f = './uploads'; incoming.uploadDir = f;
form.multiples = true;
!fs.existsSync(f) && fs.mkdir(process.env.PWD + '/uploads'); //使用绝对路径创建文件夹 incoming.on('fileBegin', function (field, file) {
if(file.name) file.path += "-" + file.name;
}).on('file', function (field, file) {
if (file.size == 0) return fs.unlinkSync(file.path);
res.write(file.name + ' received\n');
}).on('field', function (field, value) {
res.write(field + ' : ' + value + '\n');
}).on('end', function () {
res.end('All files received!');
}).parse(req, function (err, fields, files) { });
} if(req.method === 'PUT') {
var f = './uploads';
!fs.existsSync(f) && fs.mkdir(f); var fileData = new Buffer(+req.headers['content-length']);
var bufferOffset = 0; req.on('data', function (chunk) {
chunk.copy(fileData, bufferOffset); //连接Buffer对象的正确方法
bufferOffset += chunk.length;
}).on('end', function () {
var rand = (Math.random()*Math.random()).toString(16).replace('.','');
var to = 'uploads/' + rand + "-" + req.headers['x-uploadedfilename'];
fs.writeFile(to, fileData, function (err) {
if (err) throw err;
console.log('Saved file to ' + to);
})
})
}
}).listen(3000);

nodejs随记03的更多相关文章

  1. 【NodeJS 学习笔记03】先运行起来再说

    前言 最近同事推荐了一个不错的网址:https://github.com/nswbmw/N-blog/wiki/_pages 里面的教程很是详细,我们现在跟着他的节奏学习下NodeJS,一个简单的博客 ...

  2. 【Nodejs】记一次图像识别的冒险

    笔者的团队最近接到了一个有关图像识别的需求,本来应该由后端团队提供能力,native提供容器,前端团队仅负责一些“外围的形式工作”,不过由于各种各样的原因,最后的结果变成了前端团队在原有工作基础上,承 ...

  3. nodejs随记04

    aes加密 资料 简介; 例子; process 改变工作目录: process.chdir(path); 路径计算 例子 获取调用执行所在文件地址 function getCaller() { tr ...

  4. nodejs随记02

    Basic认证 检查报文头中Authorization字段,由认证方式和加密值构成: basic认证中,加密值为username:password,然后进行Base64编码构成; 获取username ...

  5. nodejs随记01

    EventEmitter var stream = require('stream'); var Readable = stream.Readable; //写入类(http-req就是),初始化时会 ...

  6. Angular4+NodeJs+MySQL 入门-03 后台接口定义

    这篇里是如何定义接口,我们一般访问接口如:post请求调用http://127.0.0.1:11000/webapi/userinfo/user 这个接口,成功返回用户信息,如果失败要返回失败原因等. ...

  7. 如何优雅的处理Nodejs中的异步回调

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...

  8. linux系统下nodejs安装过程随记

    首先下载适合的版本.这里我使用的是node v.10.36 先介绍编译安装的详细过程. 下载该版本: wget http://nodejs.org/dist/v0.10.36/node-v0.10.3 ...

  9. nodejs 记入

    1. vs2015 使用最新的 nodejs refer : http://josharepoint.com/2016/05/04/how-to-configure-visual-studio-201 ...

随机推荐

  1. ORACLE、MYSQL的JDBC配置

    info.jdbc.driverClassName=oracle.jdbc.driver.OracleDriver info.jdbc.url=jdbc:oracle:thin:@192.168.18 ...

  2. 1.SQL语句入门

    --SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有"",所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算 ...

  3. Gym 100703K Word order 贪心

    题目链接 题意:给定一个长度为n的字符串,字符串仅由"F","N","A"三种字符组成,现有一种操作P,即把两个相邻的字符调换位置.要求把所 ...

  4. supersr--九宫格公式(根据多少行多少列排版)

    - (void)layoutSubviews{ [super layoutSubviews]; NSUInteger count = self.subviews.count; NSInteger ma ...

  5. Scrapy爬取美女图片 (原创)

    有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...

  6. Delphi之DLL知识学习1---什么是DLL

    DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...

  7. WebStorm 有哪些过人之处?

    作者:方应杭链接:https://www.zhihu.com/question/20936155/answer/16654794来源:知乎著作权归作者所有,转载请联系作者获得授权. 先说缺点吧: 常驻 ...

  8. Go 中的反射要点

    简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...

  9. 11g新特性-概述 (转)

    一.新特性提纲 1.数据库管理部分 ◆数据库重演(Database Replay) 这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测试 ...

  10. ZLL主机接口的信息处理流程

    主机接口的信息处理流程 在我们翻译的文档中是用电脑端来模拟主机的,电脑代替网关发送主机接口命令的环节是在zll_controller.c中实现的,(在下载的文件中已经提供了其对应的可执行文件zllCm ...