fs模块
fs
模块提供了一个 API
,用于以模仿标准 POSIX
函数的方式与文件系统进行交互。
使用该模块:
const fs = require('fs');
读写文本
详细方法请参阅官方文档http://nodejs.cn/api/fs.html;
读取文本需要用到readFile
方法, 该方法为fs.readFile(path[, options], callback)
, callback
中可以接受两个参数err
和data
, readFile
方法为异步操作, 同样的也存在同步操作readFileSync
使用该方法:
fs.readFile('./mock/person.json', (err, data) => {
if(err) throw err;
console.log(data); // 这里将会获得文本内容, 以String形式获取
})
写入文本需要用到writeFile
方法, 该方法为fs.writeFile(file, data[, options], callback)
, file
为文件名或文件地址等, data
则是写入的数据,options
确定编码等, callback
则接收一个参数err
使用该方法:
fs.writeFile('./mock/person.json', data, err => {
if(err) throw err;
console.log('write over');
})
可以通过readFile
和writeFile
方法对本地.json
等文件进行读取和写入, 具体请查阅下方示例代码
let fs = require('fs');
let create = require('./create');
// writeJson(newRole);
// deleteJson(1);
// editJson(1, {
// name: 'Adventurer1'
// })
writeJson(create.createRole());
// pagination(0, 2)
// 分页功能
function pagination(page, size) {
fs.readFile('./mock/person.json', (err, data) => {
if(err) throw err;
let person = JSON.parse(data.toString());
let pagePerson = person.data.slice(size * page, (page + 1) * size);
console.log('pagination over');
console.log(pagePerson);
})
}
// 修改某一项(根据id, 若是存储数据格式不同则需要不同查询方式)
function editJson(id, params) {
fs.readFile('./mock/person.json', (err, data)=> {
if(err) throw err;;
let person = JSON.parse(data.toString());
for(let i = 0; i< person.data.length; i++) {
if(id === person.data[i].id) {
for(let key in params) {
if(person.data[i][key]) {
person.data[i][key] = params[key];
}
}
}
}
person.total = person.data.length;
let str = JSON.stringify(person);
fs.writeFile('./mock/person.json', str, err => {
if(err) throw err;
console.log('edit over')
})
})
}
// 写入数据, 这里是将数据填入到data数组里, 同样, 不同存储格式需要稍微修改
function writeJson(params) {
fs.readFile('./mock/person.json', (err, data) => {
if(err) throw err;
let person = JSON.parse(data.toString());
person.data = person.data || [];
console.log(person.data);
person.data.push(params);
person.total = person.data.length;
console.log(person);
let str = JSON.stringify(person);
console.log(str)
fs.writeFile('./mock/person.json', str, function(err) {
if(err) {
console.error(err);
}
console.log('add over');
})
})
}
// 删除某项, 基于id
function deleteJson(id) {
fs.readFile('./mock/person.json', (err, data) => {
if(err) throw err;
let person = JSON.parse(data.toString());
for(let i = 0; i<person.data.length; i++) {
if(id === person.data[i].id) {
person.data.splice(i, 1);
}
}
console.log(person.data);
person.total = person.data.length;
let str = JSON.stringify(person);
console.log(str);
fs.writeFile('./mock/person.json', str, err => {
if(err) return console.error(err);
console.log('delete id: ' + id + ' over');
})
})
}
下方是简易克苏鲁调查员属性生成,根据克苏鲁的召唤守秘人手册第七版设定
// create.js
function createRole() {
let str = complexD(3, 6) * 5; // 力量
let con = complexD(3, 6) * 5; // 体质
let siz = (complexD(2, 6) + 6) * 5; // 体型
let dex = complexD(3, 6) * 5; // 敏捷
let app = complexD(3, 6) * 5; // 外貌
let int = (complexD(2, 6) + 6) * 5; // 智力
let pow = complexD(3, 6) * 5 // 意志
let edu = (complexD(2, 6) + 6) * 5 // 教育
return {
str, con, siz, dex, app, int, pow, edu
}
}
function complexD(n, d) {
let b = dice(d);
for(let i = 0; i< n - 1; i++) {
b = b + dice(d);
}
return b;
}
function dice(d) {
return Math.floor(Math.random() * d) + 1;
}
module.exports = {
createRole
}
// save.js
let fs = require('fs');
let create = require('./create');
save(create.createRole());
// 写入数据
function save(params) {
let str = JSON.stringify(params);
fs.writeFile('./save.json', str, function (err) {
if (err) throw err;
console.log('add over');
})
}
node save.js
即可获得save.json
, 如:
{"str":55,"con":60,"siz":60,"dex":40,"app":40,"int":55,"pow":55,"edu":70}