今天写了一下NodeJS+Bmob条件查询的函数,最后实现了在搜索框中输入关键字,可以弹出对应的数据,该函数代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
bmobpagination : function(obj,req,res,keywords){ var params = url.parse(req.url,true); var startNum = (params.query.currentPage - 1)*params.query.limit + 1; var currentPage = Number(params.query.currentPage); var limit = Number(params.query.limit); var pageInfo; if(keywords){//判断是否传递了关键词 //console.log(keywords)//输出关键词 switch(keywords.slice(0,1)){//获得关键词的第一个字符,是不同的字母时查询不同的列 case "u"://u 查询用户学号 querystring = {"username":keywords.slice(1)}; break; case "U"://U 查询用户学号 querystring = {"username":keywords.slice(1)}; break; case "k"://k 用户类型 querystring = {"emailVerified":Boolean(parseInt(keywords.slice(1)))};//这里要注意转化为bool型 break; case "K"://K 用户类型 querystring = {"emailVerified":Boolean(parseInt(keywords.slice(1)))}; break; case "n"://u 用户姓名 querystring = {"nickName":keywords.slice(1)}; break; case "N"://U 用户姓名 querystring = {"nickName":keywords.slice(1)}; break; case "v"://v 违规次数为这个值的显示 querystring = {"violation":parseInt(keywords.slice(1))};//这里要注意转成int型 break; case "V"://V 违规次数大于这个值的显示,例如我传的参数是V1,那么大于1的,比如2次,3次的都会显示出来 querystring = {"violation":{"$gte":parseInt(keywords.slice(1))}};//大于这个数字的人全部显示 break; case "e"://e 邮箱 querystring = {"email":keywords.slice(1)}; break; case "E"://E 邮箱 querystring = {"email":keywords.slice(1)}; break; case "t"://t 注册时间 querystring = {"createdAt":keywords.slice(1)}; break; case "T"://T 注册时间 querystring = {"createdAt":keywords.slice(1)}; break; default://其他情况下关键字直接解读,并且只查询username列,即学号列。 querystring = {"username":keywords}; break; }; queryurl = 'https://api.bmob.cn/1/users?where='+encodeURI(JSON.stringify(querystring)); //console.log(queryurl); }else{ queryurl = 'https://api.bmob.cn/1/users'; }; var options = { url: queryurl, method:"GET", headers: { "X-Bmob-Application-Id": "******************************", "X-Bmob-REST-API-Key": "*******************************", }, }; function callback(error, response, body) { if (!error && response.statusCode == 200) { var info = JSON.parse(body); pageInfo = { "totalItems" : info.results.length, "currentPage" : currentPage, "limit" : limit, "startNum" : Number(startNum) }; return res.json({ docs : info.results.slice(startNum - 1,startNum + limit -1), pageInfo : pageInfo }); } } request(options, callback); }, |
新学到的函数
str.slice(start,end)
- 可提取字符串的某个部分,并以新的字符串返回被提取的部分,返回值是string类型,如果数据库是其他类型要注意类型转换。
start
:要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。end
:紧接着要抽取的片段的结尾的下标。若未指定此参数,则要提取的子串包括 start 到原字符串结尾的字符串。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。- 具体参考该链接
类型转换函数
Boolean
:转化为bool类型parseInt
:转化为Int类型- 具体参考该链接
Request条件查询
使用request进行条件查询,参考该网址,主要在url上做功夫,条件查询就是在查询所有数据的请求上通过where参数的形式对查询对象做出约束,只返回我们功期望返回的值。where参数的值应该是JSON编码过的,就是说,如果你查看真正被发出的URL请求,它应该是先被JSON编码过,然后又被URL编码过。使用where参数最简单的方式就是包含应有的key的值。举例说,如果我们想要得到Lily的记录,那该请求的URL为:
1 2 |
https://api.bmob.cn/1/classes/GameScore?where={"name":"Lily"} |
这是未经编码前我们看到的url,我们需要对URL进行URL编码,编码的的结果为:
1 2 |
https://api.bmob.cn/1/classes/GameScore?where=%7B%22name%22:%22Lily%22%7D |
不同的语言开发环境有不同的URL编码接口,如果是使用如Postman这类工具来进行测试的,可以使用一些在线的url编解码工具进行编码后再发送请求,这里推荐一个
在Javascript中,因为我们封装好的keywords是json类型,所以要注意先将keywords转为string类型,再将string类型的参数通过encodeURI函数转码,具体如下:
1 2 |
queryurl = 'https://api.bmob.cn/1/users?where='+encodeURI(JSON.stringify(querystring)); |
最后再request调用请求即可。
查询功能说明
- 无关键字直接查询:只能查询用户学号,例如输入16210720026可以查到我的信息
- 有关键字查询:
u/U+学号
:根据学号查询对应用户。示例:u16210720026;结果:得到我的信息k/K+类型
:查看邮箱验证的用户和未验证的用户。示例:k0返回未验证用户,k1返回已验证用户n/N+姓名
:根据姓名(微信名)查看对应的用户。示例:n达达;结果:得到我的信息。v+次数n
:返回违规次数为n的用户。示例:v2;结果:返回所有违规两次的学生信息。V+次数n
:返回违规次数大于等于n的用户。示例:v1;结果:返回所有违规次数大于等于1的用户信息。e/E+邮箱
:根据邮箱查看对应的用户。示例:16210720026@fudan.edu.cn;结果:得到我的个人信息。