最近在帮同事做一个扫码签到的小程序。主要功能是能够实现扫码签到和签到数据下载。然后由于自己买的服务器太小,没有安装数据库,所以只能将文件保存在本地,对本地文件进行、增、删、改、查。因为自己node平时用的比较少,所以正好趁这个机会好好学一下node。从这个小项目中一共是两个页面,首页面通过node app.js就可以启动;签到统计页面通过localhost:端口号/readfile.html来访问,在统计页面实现增、删、改、查和数据导出操作。
1、文件目录如下
2、增、删、改、查主要代码见下图,这也是这个小项目的核心代码
添加数据
app.post('/addUserInfo', urlencodedParser, function(req, res) { //post处理方法
var userInfo = JSON.parse(req.body.data);
var address = nameFormat(userInfo.address);
existAndReadFile(userInfo, "", address, "add", res)
})
复制代码
删除数据
app.post('/deleteUserInfo', urlencodedParser, function(req, res) { //post处理方法
var data = JSON.parse(req.body.data);
var address = data.address;
var index = data.index;
existAndReadFile("", index, address, "delete", res)
})
复制代码
修改数据
app.post('/updateUserInfo', urlencodedParser, function(req, res) { //post处理方法
var data = JSON.parse(req.body.data);
var address = data.address;
var index = data.index;
existAndReadFile(data.userInfo, index, address, "update", res)
})
复制代码
查询数据
app.post('/queryUserInfo', urlencodedParser, function(req, res) {
var address = req.body.data;
existAndReadFile("", "", address, "query", res)
})
复制代码
判断文件是否存在以及读取文件的封装的公共方法
function existAndReadFile(userInfo, index, address, type, res) {
var userInfos = [];
fs.exists(__dirname + '/dist/data/' + address + '.json', function(exists) {
//文件存在的情况下
if(exists) {
fs.readFile(__dirname + '/dist/data/' + address + '.json', {
flag: 'r+',
encoding: 'utf8'
}, function(err, data) {
if(err) {
console.log('读取数据出现错误!')
} else {
if(data) { //存在数据的情况下
data = JSON.parse(data);
for(var i = 0; i < data.length; i++) {
switch(type) {
case "add":
if(userInfo.userName === data[i].userName) {
return res.send("存在相同的用户名");//返回的数据,这里根据情况写
} else if(userInfo.telephone === data[i].telephone) {
return res.send("存在相同的电话号码"); //返回的数据,这里根据情况写
} else {
userInfos.push(data[i]);
//db.insert(userInfo); //数据库方法,加入了两个参数,是提交的数据
}
break;
case "delete":
//根据index来删除数据
if(i !== index) {
userInfos.push(data[i]);
}
break;
case "query":
userInfos.push(data[i]);
break;
case "update":
//更新数据
if(i !== index) {
//不能出现同名数据
if(data[i].userName === userInfo.userName) {
return res.send("存在相同的用户名")
} else {
userInfos.push(data[i]);
}
} else {
//如果是要更新的那条数据时,直接将从前端传过来的数据,替换数据库里的数据
userInfos.push(userInfo);
}
break;
}
}
//在循环结束之后
//如果是查询的话,将数据直接返回到前端,否者将数据写入到本地
switch(type) {
case "query":
//直接将数据返回给前端
return res.send(userInfos);
break;
case "delete":
case "update":
//更新和删除操作,在前面循环过程中就已经对userInfo进行了处理,所以此处传null
writeFile(userInfos, null, address, res);
break;
case "add":
writeFile(userInfos, userInfo, address, res);
break;
}
//不存在数据的情况下,直接将数据写入到本地
} else {
writeFile(userInfos, userInfo, address, res)
}
}
})
} else { //文件不存在的情况下
switch(type) {
case "add":
//将数据写入到本地
writeFile(userInfos, userInfo, address, res);
break;
case "delete":
case "update":
case "query":
//文件不存在的情况下,删除和查询及更新操作都无效
return res.send(false);
break;
}
}
});
}
复制代码
将文件写入本地的封装好的公共方法
function writeFile(userInfos, userInfo, address, res) {
if(userInfo) {
userInfos.push(userInfo);
}
fs.writeFile(__dirname + '/dist/data/' + address + '.json', JSON.stringify(userInfos), function(err) {
if(err) {
console.log('写入文件出现错误!')
return res.send(false);
}
console.log('已输出至data/*.json中');
return res.send(true);
});
}
复制代码
在项目的编写过程中,开始是遇到了一些困难,比如一开始没想到把数据存成json格式的,一开始是以txt的形式存储的;而且有时候向后台请求数据时有一些路由总是报错(http 400),后来统一全部改成post请求方式,后来没有出现过。 还有一个问题就是node调试问题,作为才使用node的人来说,希望启动node.js后也能像web前端一样的进行调试,后来百度还真找到了方法。
node浏览器端调试方法可以看此链接: blog.csdn.net/weixin_4113…
这也是自己首次用node的做小项目的一个心得吧,把这个分享出来的目的是希望能给其他同样有这种需求的人一点帮助。