前言
写了几个关于nodejs的小的demo,希望对入门有帮助!
form_data server.js
运行命令
node server
就可以看到有一个简单的form提交!
read_changeJson
运行命令
node readJson list
可以读取json文件中的数据!
运行命令
node readJson add [数据]
就可以向文件里面添加数据
process 解释
process.argv
一个包含命令行参数的数组.
第一个元素会是 'node',第二个元素将是.js文件的名称. 接下来的元素依次是命令行传入的参数.
// 要获取真正的参数元素,需要首先将数组的前两个元素去除掉
console.log(process.argv.slice(2));
process.cwd()
返回进程当前的工作目录.
console.log('Current directory: ' + process.cwd());
process.stdout
一个可写流到标准输出,即控制台输出流.
console.log = function (d) {
process.stdout.write(d + '\n');
};
process.stdin
一个标准输入的可读数据流.
标准输入流默认将暂停,所以必须调用process.stdin.resume()去从中读取.
process.stdin.resume();
process.stdin.setEncoding("utf8");
process.stdin.on("data", function (chunk) {
process.stdout.write("你录入的是:" + chunk);
});
process.stdin.on("end", function () {
process.stdout.write("录入完毕.");
});
process.chdir()
改变当前进程的工作目录,若操作失败则抛出异常.
console.log('当前目录:' + process.cwd());
try {
process.chdir('/tmp');
console.log('新目录:' + process.cwd());
} catch (err) {
console.log('chdir: ' + err);
}
一.直接操作文件
最简单的两个fs.readFile和fs.writeFile
举例:这个程序的功能是将一个比较大json格式的文件转换成你想自己要格式的文件。
var fs = require('fs');
fs.readFile('./json.json',function(err,data){
if(err) throw err;
var jsonObj = JSON.parse(data);
var space = ' ';
var newLine = '\n';
var chunks = [];
var length = 0;
for(var i=0,size=jsonObj.length;i<size;i++){
var one = jsonObj[i];
//what value you want
var value1 = one['value1'];
var value2 = one['value2'];
....
var value = value1 +space+value2+space+.....+newLine;
var buffer = new Buffer(value);
chunks.push(buffer);
length += buffer.length;
}
var resultBuffer = new Buffer(length);
for(var i=0,size=chunks.length,pos=0;i<size;i++){
chunks[i].copy(resultBuffer,pos);
pos += chunks[i].length;
}
fs.writeFile('./resut.text',resultBuffer,function(err){
if(err) throw err;
console.log('has finished');
});
});
它的原理是将文件数据一次性全部读入内存,优点就是接下来都是在内存的操作,速度会很快。但缺点也很明显,就是当文件非常大时,会造成内存溢出。
二. 使用文件流
2.1 读取文件,api相见:fs.createReadSream 和 fs.createWriterStream
以下代码实现的功能就是通过文件流来实现图片的复制:
var fs = require('fs');
var rOption = {
flags : 'r',
encoding : null,
mode : 0666
}
var wOption = {
flags: 'a',
encoding: null,
mode: 0666
}
var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);
fileReadStream.on('data',function(data){
fileWriteStream.write(data);
});
fileReadStream.on('end',function(){
console.log('readStream end');
fileWriteStream.end();
});
这里再补充在流中非常有用的一个函数:pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中。使用起来非常方便,依然实现上例中的功能:
var fs = require('fs');
var fileReadStream = fs.createReadStream('./myjpg.jpg');
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg');
fileReadStream.pipe(fileWriteStream);
fileWriteStream.on('close',function(){
console.log('copy over');
});
用这个函数可以轻松地实现一个静态资源服务器:
var http = require("http");
var fs = require("fs"),
var path = require("path"),
var url = require("url");
var server = http.createServer(function(req, res) {
var pathname = url.parse(req.url).pathname;
console.log(pathname);
var filepath = path.join("./tmp", "wwwroot", pathname);
console.log(filepath);
var stream = fs.createReadStream(filepath, {flags : "r", encoding : null});
stream.on("error", function() {
res.writeHead(404);
res.end();
});
stream.pipe(res);
});
server.on("error", function(error) {
console.log(error);
});
server.listen(8088,function(){
console.log('server listen on 8088');
});
三,读写中文内容文件操作 .
由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之类的编码,
因此如果要读写GBK或GB2312格式的文件的中文内容,必须要用额外的模块:iconv-lite
1、安装模块:npm install iconv-lite
2、演示代码,把下面的代码复制到一个文件中,假设是ch.js(注意:js文件必须保存为utf8编码格式):
// 加载File System读写模块
var fs = require('fs');
// 加载编码转换模块
var iconv = require('iconv-lite');
var file = "c:\\a.txt";
writeFile(file);
readFile(file);
function writeFile(file){
// 测试用的中文
var str = "\r\n我是一个人Hello myself!";
// 把中文转换成字节数组
var arr = iconv.encode(str, 'gbk');
console.log(arr);
// appendFile,如果文件不存在,会自动创建新文件
// 如果用writeFile,那么会删除旧文件,直接写新文件
fs.appendFile(file, arr, function(err){
if(err)
console.log("fail " + err);
else
console.log("写入文件ok");
});
}
function readFile(file){
fs.readFile(file, function(err, data){
if(err)
console.log("读取文件fail " + err);
else{
// 读取成功时
// 输出字节数组
console.log(data);
// 把数组转换为gbk中文
var str = iconv.decode(data, 'gbk');
console.log(str);
}
});
}
3、用node.exe执行这个js文件,结果如下:
C:\>node ch.js
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>
写入文件ok
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>
我是一个人Hello myself!
C:\>
注1:Node的iconv模块,仅支持linux,不支持Windows,因此要用纯js的iconv-lite,另:作者说iconv-lite的性能更好,具体参考Git站点:iconv-lite
注2:我在测试读写文件时,始终无法把中文写入文件,一直乱码,读取正常,后来同事帮我发现:js文件的编码格式是ansi,nodejs的代码文件必须是utf8格式
注3:如果程序操作的文件,都是以UTF8编码格式保存的,那么就不需要使用iconv模块,直接以utf8格式读取文件即可,如:
// 参数file,必须保存为utf8格式,否则里面的中文会乱码
function readFile(file){
// readFile的第2个参数表示读取编码格式,如果未传递这个参数,表示返回Buffer字节数组
fs.readFile(file, "utf8", function(err, data){
if(err)
console.log("读取文件fail " + err);
else{
// 读取成功时
console.log(data);// 直接输出中文字符串了
}
});
}
结论:使用node.js开发时,无论是代码文件,还是要读写的其它文件,都建议使用UTF8编码格式保存,这样可以无需额外的模块支持