云函数常见问题

Q:使用云函数需要掌握什么语言

A:Javascript,因为云函数是用Nodejs部署架构的。


Q:云函数能做什么事情

A:云函数的推出是为了给大家解决更多后端业务逻辑的问题,让大家尽可能把更多的业务逻辑挪到云端,实现更快的更新迭代。目前,云函数除可以自由操作云端数据库外,还提供了邮件模块HTTP模块事件模块等,方便大家自由发挥。


Q:云函数能上传文件吗

A:暂不支持。


Q:如何调试云函数

A:


Q:云函数或者android上update能否不用objectid用组合条件

A:只能根据objectid来,在查询返回的结果集中有objectid


Q:云函数,可以把消息发给IMSDK吗

A:目前不可以。


Q:url转码怎么转

A: encodeURI(url)


Q:如何使用同步的ohttp.post请求

A:用eventproxy


Q:相同的代码,在Local中可以返回正确的结果,在Server中返回错误。请问如何解决?

A:把本地的nodejs版本改成和云端一样,然后调试通过就可以了


Q:bmob的短信服务端验证接口云函数怎么做?要发送一个post请求

A:使用云函数发送http请求即可


Q:生成新应用时云函数没有复制到新应用

A:可使用云函数的本地调试工具可以运行后可以直接导入


Q:云函数能否实现 WebSocket ?

A:云函数无法使用第三方库


Q:往表中添加基本类型的数据是调用数据库对象的insert方法,而添加关联关系对象是用add方法??那我的表里有这两种数据类型,该怎么添加数据

A:分别存储


Q:保存一个Object类型字段的值为null的时候会报错

A:保存为这样{}


Q:如何实现一个签到的逻辑

A:在用户表添加一个字段—签到时间,当用户发送请求的时候,更新这个签到时间,如果签到时间为今天,说明已经签到


Q:where语句如何查询24小时之前创建的记录?

A:查询createdAt在24小时之前的记录就可以了


Q:删除数据库记录只能用objectId吗?不能用where条件吗

A:只能用objectId,where条件用于查询,查询后的结果集中会有ObjectId的。


Q:云函数怎么设定where条件

A:

  1. "where":{
  2. "updatedAt":{
  3. "$lt":{"__type":"Date","iso":"2014-01-29 11:33:53"}
  4. }

Q:在查找数据库的回调里面再查找,不能收到回调消息

  1. db.find(
  2. {
  3. "table":strTableName,
  4. "count":1,
  5. "limit":0,
  6. },
  7. function(err1,data1)
  8. {
  9. var searchNum = data1; //表的总行数,用sql语句获得
  10. var limitnum=1000; //默认最多返回1000条记录
  11. var runcount= parseInt(searchNum/1000);
  12. var strOutID = '';
  13. //分多次获取记录,因为每次只能获取1000条
  14. var i = 0;
  15. for(i = 0;i !== runcount; i++){
  16. var skipNum= 1000*i;
  17. if( i==runcount ) {
  18. limitnum=searchNum-skipNum;
  19. } else {
  20. limitnum=1000;
  21. }
  22. //能执行到这里,
  23. //response.send('data1');
  24. db.find(
  25. {
  26. "table":strTableName,
  27. "count":1,
  28. "limit":0,
  29. },
  30. function(err2,data2)
  31. {
  32. //这里执行不到
  33. response.send('data2');
  34. }
  35. );
  36. }
  37. }
  38. );

A:不能这样取,只能取一次,然后再取一次,不能在里面for循环


Q:云函数可以查询支付订单吗?返回订单结果和数额之类的,有相关函数吗

A:可以使用云函数去调用restful接口来查询


Q:云函数可以实现抓取别的网页信息吗
比如说,我客户端去请求云函数,让云函数实现抓取某个咨询网站的信息

A:可以,使用云函数的http请求抓取即可。


Q:请问云函数可以发送短信吗?

A:可以通过云函数调用restful接口来实现。


Q:云函数更新用户表错误
但是最后返回的err包含错误信息
{“code”:206,”message”:”User cannot be altered without sessionToken Error.”}

A:必须先登录才能更新


Q:请问云函数怎么返回JSON数据

A:

  1. var data = { dir: 'kunhony', param: 'archive' };
  2. var str = JSON.stringify(data);
  3. response.end(str);

Q:如何在云端请求微信

A:http://docs.bmob.cn/cloudcode/WEB/d_cloudcodeweixin/doc/index.html


Q:Bmob中如何支持Cookie?用于将SessionID分配给浏览器

A:不支持set-cookie的方法。


Q:请问云函数如何返回错误?

A:如下,代码一般为这种形式,如果错误,返回response.send(err);

  1. function onRequest(request, response, modules) {
  2. var functions = modules.oFunctions;
  3. functions.run({
  4. "name": "test",
  5. "data":{"content":"你好","address":"guangzhou"}
  6. },function(err,data){
  7. //回调函数
  8. if(err){
  9. response.send(err);
  10. }else {
  11. response.send(data);
  12. }
  13. });
  14. }

Q:开发公众号可以获取微信的openid吗

A:可以


Q:云函数如何进行模糊查询

A:调用restful的模糊查询接口


Q:云函数能引入第三方模块吗?如underscore

A:不可以,如要使用第三方模块,可考虑使用窗口服务。


Q:我有一个云函数,客户端访问的时候查看一条数据库对象,如果不存在,则创建、返回,如果存在则直接返回。所有客户端的访问都是查看同一个对象,如何保证多个客户端同时访问的时候不会同时创建多个对象?

A:目前这个无法做到。


Q:bql不支持 delete语句吗

A:目前bql只支持查询语句。


Q:表设置了 ACL, 我想用 master key 或 用户的 token 去更新表,在云端用批量更新模块,如何传入master key 或 用户的 token ?

A:目前不支持


Q:云函数怎么延迟执行一个操作

A:目前并无该项功能


Q:云函数中不同的模块中经常出现相同代码 有没有办法把这些代码提取到公共区域来复用

A:云函数之间是可以相互调用的,具体查看云函数云对象章节。


Q:如何清空某个数据表?

A:需要先将表的所有值查询下来,然后遍历去删除,具体参考文档的查询及删除对象章节


Q:怎么在云端调用 获取短信验证码、验证短信验证码

A:使用云函数进行http请求,请求RESTful接口即可


Q:云端如何自定义返回数据

A:定义好格式后以JSON形式返回


Q:云函数MD5加密中文,结果怎么和PHP的不一样?

A:编码问题,https://cnodejs.org/topic/54ad4e40ce87bace2444cc49


Q:BMOB云端数据库导入需手动导入CSV格式,如何做到自动抓取我本地CSV文件传入云端数据库

A:Bmob导入数据,只可以从web后台手动导入。如果你要自动从本地传入数据库的话,可以自己写代码(程序)实现,用Bmob提供的SDK或基于RestApi来插入数据到云端数据库中。


Q:云端数据库更新需上传CSV文件,如何实现自动云端更新

A:云端数据库与你本地数据库的结构可能会有区别,需要你针对自己的数据库特点,读取本地数据库,转换后再进行上传


Q:用云端查询db.find,查询到表里的数据,返回的字段名也是表的列名,有没有像sql里面as的方式修改这个名字

A:目前还没有这个功能


Q:如果一个字段里没有值,查询后返回的内容也没有这个字段,如果才能让这个字段也出现在返回的内容里。

A:由于后台使用的是MongoDB,是无模式的,没有初始值,因此只有显示地给该字段赋值才会有内容返回。


Q:写云函数的时候,只能通过objectId来查询符合条件的一行数据?我想用表中的其他字段当做查询条件怎么写?

A:可以使用条件查询,具体查看数据库对象中的查询多条数据小节。


Q:用skip和limit来实现分页查询的话,如果表里的数据更新的很快的话,会不会查询出重复的数据?

A:会出现重复数据,因此,一般您在查询时可以加上限制,比如,查询第一页时的时间为A,那您可以约束查询创建时间在A之前的数据,在那之后的数据不查询,这样就不会有重复了。


Q:该如何实现类似乐观锁的功能

A:目前并没有提供该类型的接口


Q:连上vpn没有数据返回

A:可以在连上VPN时ping https://api.bmob.cn/看看能否ping通,有可能是VPN屏蔽了


Q:云函数中where条件怎么表示!=?

A:您好,可以参考restful文档中的查询数据中的条件查询,大概的形式为”type”:{“$ne”:”delete”}


Q:如何更新1000条以上的记录

A:可以采用分页,先取1000条数据进行更新,再取1000条之后的数据接着更新


Q:请问云函数请求HTTP时如何获取cookies和带cookies访问?

A:将var http = modules.oHttp;
改成var http = modules.oHttp.defaults({jar: true});
即可使用全局cookie,后面的链接就不需要手动输入cookie了。


Q:JavaScript能调用云函数吗(xx平台能调用云函数)

A:只要支持https请求就可以通过restful来调用云函数,部分sdk直接封装了调用云函数的接口,具体可以查看云函数文档。


Q:请问云端new Date()如何获取和createTime里面一样的时间

A:createAt这个属性是特殊字段,为了节约HTTP流量,我们没有进行特殊字段类型处理,直接返回string类型。你在云函数里面new Date()获取的是一样的时间,因为服务器的时间是保持一致的。至于两者的数据格式问题,你可以自行处理。


Q:云函数数据库可以返回多少条记录?

A:一次最多只能返回1000次数据,如果要获取的数据大于整个数目,必须要分多次查询


Q:云函数只能添加方法吗
我想在云函数中添加一个功能模块,但是发现云函数中的每个文件都是独立的,而且只能是方法,我想问一下能不能实现。

A:完全可以在方法内声明方法或者类的,这个不影响,而且可以通过间接调用的方式调用其他云函数的执行。


Q:webstorm在本地搭好服务器,在不联网的情况下,使用ios调用运行在本地的服务端代码,能不能利用这样的方式测试?

A:不可以,数据保存在云端,不联网无法操作数据,本地调试过程中不需要客户端的参与。


Q:云函数执行console.log无输出

A:在真正的云函数上,不支持console.log这种输出,只能使用res.end()


Q:云端怎么实现 var wpwp = require(‘wpwp’)(‘YOUR-KEY’);

A:云函数进行了封装,无法加载非官方模块。


Q:如何更新数据表中Date的数据

A:

  1. var userData = dataObject.results[0];
  2. var checkDate = userData.checkDate.iso;
  3. var lastDate = new Date(checkDate.toString());
  4. var nowDate = new Date();
  5. db.setHeader({"x-bmob-session-token":request.body.sessionToken.toString()});
  6. userData.checkDate.iso=nowDate;
  7. db.updateUserByObjectId({"objectId":request.body.objectId.toString() ,data: {"checkDate":userData.checkDate,"diamond":parseInt(userData.diamond)+10}},function(err,data)
  8. {
  9. })

Q:containedIn在云函数里面是什么指令

A:对应为 http://docs.bmob.cn/data/Restful/b_developdoc/doc/index.html#查询 里面的 $in 查询,你可以参考restful文档,在where条件中使用就可以了。


Q:如何在云函数中计算两个时间的时间差

A:

  1. var lastDate;//一定要是Date哦
  2. var nowDate = new Date(data);
  3. Date.parse(nowDate) - Date.parse(lastDate)
  4. //注意:单位是毫秒级的哦

Q:批量操作对象中 “path”: “/1/classes/GameScore” ,其中的 “/1/class/ “是什么来的?怎么确定下来的?

A:/1/classse/ 是系统规定的路径,其中1是系统内部的版本号,classes表示接下来要操作的是数据表。


Q:云函数能不能实现函数递归调用

A:可以,但要注意不能过于复杂,5s内无回调会提示超时。


Q:我想用云函数修改user表中的数组,要如何设置?如何先获取表中的数组呢?获取了之后又要如何用arr.addUnique更新?求示例。

A:要修改User表中的数据需要注意:

  1. 要么你有登录用户的sessionToken信息(也就是权限),这样可以修改用户信息;
  2. 要么你用masterKey(也就是超级权限)来修改用户信息。

获取表中的信息非常简单,你直接Get就可以了,获取之后,你直接用类似如下的方法解决:

  1. var arr = modules.oArray;
  2. arr.addUnique({
  3. "table":"_User",
  4. "objectId":"j4w2DDDT", //这个对应是这个用户的objectId
  5. "data":{"skills":{"__op":"AddUnique","objects":["flying","kungfu"]}}
  6. },function(err,data){
  7. //回调函数
  8. });

Q:云函数比较复杂的时候,很难找出根本原因

  1. 能否支持加入日志,通过查看日志来debug?
  2. 能否有类似IDE的断点,或者是报错信息更明确一点在哪里出错?

A:可以借助我们开发的这个云函数本地化调试工具来调试:
https://github.com/bmob/bmob-cloud-tool


Q:对于设置了ACL为用户只读的数据,如何在云函数里将其全部读出?

A:使用masterKey
云函数设置masterkey的方法:

  1. function onRequest(request, response, modules) {
  2. var db = modules.oData;
  3. db.setHeader({"X-Bmob-Master-Key":"这里填写Master Key信息"});
  4. db.updateUserByObjectId({"objectId":"这里是需要更新的用户ObjectId信息" ,data:{"username":"123"}},function(err,data){
  5. response.end("更新成功");
  6. });
  7. }

Q:如果把代码放在云端,本地JS调用时,是否需要输入Application ID、REST API Key才能进行调用呢?

A:只需要在初始化js sdk的时候传人Application ID、REST API Key就行了,在js调用云函数的时候不需要传入


Q:云函数里如何获取当前时间

A:云函数是运行在nodejs的环境中,所以js的函数能用在云函数上。
获取时间: var now = new Date();


Q:调用云函数,能否获取调用者的真实IP,想用IP来做排行榜的地理位置统计

A:云函数打印headers

  1. function onRequest(request, response, modules) {
  2. response.send(request.headers);
  3. }

结果:

  1. Response Body
  2. {
  3. "code": 200,
  4. "msg":
  5. {
  6. "x-real-ip": "114.114.114.114",
  7. "x-forwarded-for": "114.114.114.114",
  8. "host": "cloud.bmob.cn",
  9. "x-nginx-proxy": "true",
  10. "connection": "close",
  11. "accept": "/",
  12. "a": "",
  13. "content-length": "7",
  14. "content-type": "application/x-www-form-urlencoded"
  15. }
  16. }

x-real-ip就是用户的真实ip的


Q:请问怎么查询用户当前排名
比如:我有个GameScore 表
字段有:username,score
现在排行榜里面数据有5000多条,我知道某个用户objectId,如果快速找出排名位置呢?

A:解决方案:
根据order排名,把所有排名按次序放到一个数组中,然后根据objectId查找到某个用户名,用户名在这个数组中的位置即是他的排名。
RestAPI查询条件如下:
第一步:先查询到某个用户的用户名:

  1. curl -X GET \
  2. -H "X-Bmob-Application-Id: Your Application ID" \
  3. -H "X-Bmob-REST-API-Key: Your REST API Key" \
  4. -G \
  5. --data-urlencode 'keys=username' \
  6. https://api.bmob.cn/1/users/某个用户的objectId

第二步:score降序获取前1000名的用户的用户名:

  1. curl -X GET \
  2. -H "X-Bmob-Application-Id: Your Application ID" \
  3. -H "X-Bmob-REST-API-Key: Your REST API Key" \
  4. -G \
  5. --data-urlencode 'keys=username&order=-score&count=true&limit=1000&skip=0' \
  6. https://api.bmob.cn/1/classes/GameScore

返回前1000名的用户名,判断前一个查询的用户名是否在这个数组的哪个位置,如果没有找到,继续第二步, skip设为1000,直到找到为止。

优化方案:
GameScore应该添加Pointer类型指向某个用户,然后在GameScore添加一个排名的列,更新score的时候更新排名,这样就可以直接根据用户的objectId一条查询就出来了。