多多少少的之前有看了不少nodejs的教程,一般都是n+m+e的套路,都是做了点小文件试试,没实践。
公司项目来了,需要用到nodejs,下面就给大家分享我的刨坑日记吧。
项目是基于wifi的,打算做前后端分离,后端nodejs只要暴露api给前端就可以了。因为没怎么深入node,所以现在也不太清楚差别在哪~。~
模块选用的就一个,node-odata,(貌似群里很多人都没听说过),老板说这个好用,简单。
var odata = require('node-odata');
//数据库
var server = odata('mongodb://localhost/test');
//odata把get/put/delete/post,都封装成resource了。
//注册表集合。注册好以后就前端可以直接用4个请求来增删改查了,看起来很吊~
server.resource('count',{
mac:String,
username:[{
username:String,
clicker:Number
}]
})
//开启监听
server.listen(3000,function(){
console.log("listen 3000 start");
})
这样就做好了count表的api,是不是很吊!当然,也可以自己定义api。
//定义需要其他自定义逻辑的api
server.get('/addcount',function(req,res){
//node-odata中可以使用mongodb也可以使用express的语法,(其实是odata把他们也封装了吧应该)
var mac = req.query.mac;
var username = req.query.username;
var clickes = req.query.clickes;
//findOne应该是mongodb的语法
server.resources.count.findOne({mac:mac},function(err,data){
//如果没有重复的MAC,就添加纪录
if(!data){
//直接创建一条数据
var newcount = server.resources.count({
mac:mac,
username:[{
username:username,
clickes:clickes
}]
})
//保存
newcount.save(function(err,data){
//保存成功,返回该数据
res.json(data);
})
//如果有重复的mac,看下有没有重复的username,没有就添加,有就修改,把clickes加上去
}else{
var names = false;
for(var i=0;i<count.username.length;i++){
if(count.username[i].username == username){
names = i;
}
}
if(typeof(names) == 'number'){
//嗯。项目上是有的话点击次数加一
count.username[names].clickes++;
}else{
var userArr = count.username;
userArr.push({username:username,clickes:1});
count.username = userArr;
}
//最后还是保存数据
count.save(function(err,data){
res.json(data);
})
}
})
})
这里碰到了两个坑。
1.定义数据模型子文档(也就是数组)的时候,不要直接定义Array,定义成数组的话,你在往里添加数据的时候mongodb会把他当成混合数据,就不能修改了。所以要定义子文档里面的字段的数据类型。
2.上面没写,在弄金额字段的时候,Number类型的坑,所有数字最好都用整数,不要小数。1块钱就存成100分,取出来的时候自己/100就行了。
然后是前端的代码。本来是要用原生的,后来为了方便~还是用了zepto.min.js
$.ajax({
url:"http://localhost:3000/addcount",
type:"get",
data:{
"mac":mac,
"username":username,
"clickes":1
},
async: true,
success:function(data){
console.log(data);
... ... ...
}
})
就一个AJAX请求
1.最简单的请求,url直接请求地址+表集合.
然后根据type get是查看,post是添加,put是改,delete是删除。
get 是 url:”http://localhost:3000/count”
post也是这个url,然后把data传过去。
put和delete就是url:”http://localhost:3000/count(id)”
这个id就是数据库里的id。
然后自定义的就自己写就好咯~