nodejs模块 node-odata

陈实
2023-12-01

多多少少的之前有看了不少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。
然后自定义的就自己写就好咯~

 类似资料: