bmob运行权限在哪android 动态添加权限

Android SDK错误码列表
AppKey is Null, Please initialize BmobSDK.
Application Id为空,请初始化.
Parse data error
解析返回数据出错
upload file error
上传文件出错
upload file failure
文件上传失败
A batch operation can not be more than 50
批量操作只支持最多50条
objectId is null
objectId为空
BmobFile File size must be less than 10M.
文件大小超过10M
BmobFile File does not exist.
上传文件不存在
No cache data.
没有缓存数据
The network is not normal.(Time out)
BmobUser does not support batch operations.
BmobUser类不支持批量操作
context is null.
上下文为空
BmobObject Object names(database table name) format is not correct.
BmobObject(数据表名称)格式不正确
第三方账号授权失败
第三方账号授权失败
其他错误均返回此code
其他错误均返回此code
The network is not available,please check your network!
无网络连接,请检查您的手机网络.
与第三方登录有关的错误,具体请看对应的错误描述
与第三方登录有关的错误,具体请看对应的错误描述
参数不能为空
参数不能为空
格式不正确:手机号码、邮箱地址、验证码
格式不正确:手机号码、邮箱地址、验证码
iOS SDK错误码列表
It is busy...Try it later!
一般是请求服务器的内容有误,如果是查询的话,请检查一下查询条件是否有误.
nil password!
登录或者注册时输入的密码为空.
nil username!
登录或者注册时输入的用户名为空.
connect failed!
none objectid!
更新对象、删除对象、查询单个对象时没有objectid
none object!
查询时,查询结果为空
缓存查询时,查询时间已过期
cloud function failed!
云端逻辑调用失败
none filename!
上传文件时,文件名为空
none file!
上传文件时,找不到文件
unknow error!
none filendata!
上传文件时,文件内容为空
update content is nil!
更新时,更新内容为空
fuction name is nil!
调用云端逻辑时,函数名为空
array is too big!
批量操作时,传入的数组超过界限
nil array!
批量操作时,传入的数组为空
nil push content!
推送时,推送内容为空
init is not finish,please wait a moment
初始化未完成
初始化失败
format error
批量文件上传时格式错误
nil class name
string is nil or equal &&
传的参数有错,一般是传入空字符串造成
Invalid mobile phone number, the format can't be empty or null
非法手机号
Invalid sms code, the format can't be empty or null
非法验证码
File not exist
获取文件url、删除文件时传入的文件名不存在
Android支付功能相关错误码
微信返回的错误码,可能是未安装微信,也可能是微信没获得网络权限等
微信支付用户中断操作
未安装微信支付插件
设置了安全验证,但是签名或IP不对
支付宝支付用户中断操作
支付宝支付出错,可能是参数有问题
解析服务器返回的数据出错,可能是提交参数有问题
服务器端返回参数出错,可能是提交的参数有问题(如查询的订单号不存在)
解析服务器数据出错,可能是提交参数有问题
查询订单号时未输入订单号
微信客户端未安装
微信客户端版本不支持微信支付
网络异常,可能是没有给应用网络权限
商品名或详情不符合微信/支付宝的规定(如微信商品名不可以超过42个中文)
上次发起的请求还未处理完成,禁止下次请求,可用BmobPay.ForceFree()解除
iOS 支付功能相关错误码列表
重复支付,当上一个支付操作未完成时就调用下一次支付操作会引发该错误
appScheme为空
订单号为空
网络连接失败
REST API错误码列表
HttpResponseCode
unauthorized
It is busy...Try it later!
当HttpResponseCode的值为401或500时,接口返回的内容格式如下:{
&error&: &unauthorized&
error为上表中含义的值当HttpResponseCode的值为400时,接口返回的内容格式如下:{
&code&: 101,
&error&: &object not found for e1kXT22L&
code为下表中的错误码,error为下表中的内容以下是HttpResponseCode为404时返回内容的详细说明,信息中的%s,%d,%f将替换为详细的信息或具体的值。
object not found for %s. OR username or password incorrect
查询的 对象或Class 不存在 或者 登录接口的用户名或密码不正确
Invalid key '%s' for find OR Invalid value for key '%s'. OR %s: invalid geopoint object.
查询中的字段名是大小写敏感的,且必须以英文字母开头,有效的字符仅限在英文字母、数字以及下划线。,或查询对应的字段值不匹配,或提供的地理位置格式不正确
objectId required. OR classname '%s' must start with a letter.
查询单个对象或更新对象时必须提供objectId 或 非法的 class 名称,class 名称是大小写敏感的,并且必须以英文字母开头,有效的字符仅限在英文字母、数字以及下划线.
relation className '%s' not exists.
关联的class名称不存在
invalid field name: %s. OR It is a reserved field: %s.
字段名是大小写敏感的,且必须以英文字母开头,有效的字符仅限在英文字母、数字以及下划线 或 字段名是默认保留的,如objectId,createdAt,updateAt,ACL
%s: is not a valid Pointer.
不是一个正确的指针类型
invalid json: %s.
输入的json不是正确的json格式
This endpoint only supports Content-Type: application/json requests, not %s.
请求只支持Header头部Content-Type值为application/json或application/ charset=utf-8
invalid date: %s.
时间格式不正确
ACL shoud be like: {&*&:{&read&:true},&eAfHB29gP9&:{&write&:true}}.
ACL应该像这样的{&*&:{&read&:true},&eAfHB29gP9&:{&write&:true}}
invalid op value
不是正确的__op的值
username and password required.
用户名和密码是必需的
login data required.
登录信息是必需的,如邮箱和密码时缺少其中一个提示此信息
invalid type for key '%s', expected '%s', but got '%s'.
传入的字段值与字段类型不匹配,期望是这样(%s)的,但传过来却是这样(%s)的
requests must be an array.
requests的值必须是数组
every request shoud be an object like:{&method&: &POST&,&path&: &/1/classes/GameScore&,&body&: {&score&: 1337,&playerName&: &Sean Plott&}}
requests数组中每个元素应该是一个像这样子的json对象
requests array larger than %d
requests数组大于50
Latitude must be in [-90, 90]: %f. OR Longitude must be in [-180, 180]: %f.
纬度范围在[-90, 90] 或 经度范围在[-180, 180]
Email verify should be opened in your app setup page of bmob
要使用此功能,请在后台应用设置中打开邮箱认证功能开关
Invalid device token:%s
不正确的deviceToken
Invalid installation ID:%s
不正确的installationId
Invalid device type:%s
不正确的deviceType
device token '%s' already token.
deviceToken已经存在
installation ID '%s' already token.
installationId已经存在
%s cannot be changed by this operation OR deviceToken may not be set for deviceType android
只读属性不能修改 或 android设备不需要设置deviceToken
%s is read only.
表是只读的
Role names must be restricted to alphanumeric characters, dashes(-), underscores(_), and spaces.
角色名称是大小写敏感的,并且必须以英文字母开头,有效的字符仅限在英文字母、数字、空格、横线以及下划线。
role name '%s' already taken.
角色名称已经存在。
Missing the push data.
缺失推送需要的data参数
%s shoule be like:
时间格式应该如下:
%s must be a number&
必须是一个数字
%s cannot before now
不能是之前的时间
file size error
文件大小错误
file name error
文件名错误
file offeset error
文件分页上传偏移量错误
file ctx error
文件上下文错误
empty file
file upload error
文件上传错误
file delete error
文件删除错误
image error
image mode error
图片模式错误
image width error
图片宽度错误
image height error
图片高度错误
image longEdge error
图片长边错误
image shortgEdge error
图片短边错误
%s missing
username '%s' already taken.
用户名已经存在
email '%s' already taken.
邮箱已经存在
you must provide an email.
必须提供一个邮箱地址
no user found with email '%s'.
没有找到此邮件的用户
no user found with username '%s'.
没有找到此用户名的用户
User cannot be altered without sessionToken Error.
登录用户才能修改自己的信息。RestAPI的Http Header中没有提供sessionToken的正确值,不能修改或删除用户
code error.
验证码错误
authData error.
authData不正确
authData already linked by other user.
authData已经绑定了其他用户账户
mobilePhoneNumber '%s' already taken.
该手机号码已经存在
old password incorrect.
旧密码不正确
验证错误详细提示,如邮箱格式不正确
your app setting '%s'.
Bmob后台设置了应用设置值, 如'不允许SDK创建表 '
云端逻辑运行错误的详细信息
invalid cloudcode name: %s.
云端逻辑名称是大小写敏感的,且必须以英文字母开头,有效的字符仅限在英文字母、数字以及下划线。
unique index cannot has duplicate value: %s
唯一键不能存在重复的值
query where larger than %d bytes.
查询的wher语句长度大于具体多少个字节
Invalid bql:%s
不正确的BQL查询语句
VIP付费限制相关错误码
Tables of the app can create has reached to limit
该应用能创建的表数已达到限制
Rows of the table can add has reached to limit
该表的行数已达到限制
Fields of the table can add has reached to limit
该表的列数已达到限制
Request api of the this month has reached to limit
每月api请求数量已达到限制
Crontab jobs of the app has reached to limit
该应用能创建定时任务数已达到限制
CloudCodes of the app has reached to limit
该应用能创建云端逻辑数已达到限制
The file is larger than file size you can upload
你上传的文件大小已超出限制
支付功能相关错误码
order_no is null.
订单号是空的.
%s required
有些项是必填的
order_no not exists.
你要查询的订单号不存在.
详细错误信息,如微信或支付宝返回的详细错误.
详细错误信息,如微信或支付宝返回的详细错误.
短信功能相关错误码
短信功能包含的错误码,除了包括以上的109, 207, 209 状态码外,还定义了以下错误码:
mobile '%s' send message limited.
该手机号发送短信达到限制(对于一个应用来说,一天给同一手机号发送短信不能超过10条,一小时给同一手机号发送短信不能超过5条,一分钟给同一手机号发送短信不能超过1条)
no remaining number for send messages.
该账户无可用的发送短信条数
your credit info must verify ok.
身份信息必须审核通过才能使用该功能
sms content illegal.
非法短信内容注意:目前支付宝无法使用,请用户暂时不要接入,等待官方的恢复公告!简介
Android支付SDK接口是Bmob为广大开发人员提供的统一、正规的收费手段,让没有企业认证的个人开发者,也能通过支付宝和微信向用户收费。该文档可以让您快速为自己的应用接入Bmob的支付功能。下图为使用支付的流程。使用需知
使用Bmob支付组件前,请认真阅读。对于以下两种情况,开发者需要特别注意:1.违反服务协议,特别是含有以下内容的应用:1)封建迷信和/或淫秽、色情、下流的信息或教唆犯罪的信息;2)博彩有奖、赌博游戏、“私服”、“外挂”等非法互联网出版活动;Bmob平台有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,本平台有权视用户的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止本平台网站账号的使用,追究法律责任等措施。2.应用遇到过多的用户投诉,如应用的使用者支付了相关款项,但是该应用却没有提供相应的服务。本平台有权限制或冻结该应用支付收入的所有款项,并保留追究法律责任的权利。打款需知
1.打款前请先在控制台填写以下信息2.每月的1、2、16、17号为申请打款时间,15号、月尾日为打款时间,确保用户有半个月的追诉期。Bmob将收取5%手续费。支持平台
目前安卓的支付支持支付宝和微信支付。启用须知
在Bmob财务管理平台进行身份认证,以保证资金安全
建立的支付界面必须包含类似于以下界面的声明,即”收款方为第三方支付服务商,(内容自定,如付款后您的vip将在当天开通等)。如有问题,请联系(你产品的客服联系方式)“,这里的收款方必须注明为(第三方支付服务商)&,并且必须有留下开发者的客服联系方式。针对每一款支付应用我们都会进行审核,如果不满足要求,Bmob有权停用支付功能。
如有任何疑问或者建议,欢迎加入Bmob支付的技术支持QQ群:
支付接口快速入门
将名为libs的文件夹放在您项目根目录下(里面有 BmobPay_版本号.jar文件)
在您项目的AndroidManifest.xml中添加以下权限:
&uses-permission android:name=&android.permission.INTERNET& /&
&uses-permission android:name=&android.permission.MODIFY_AUDIO_SETTINGS& /&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE& /&
&uses-permission android:name=&android.permission.ACCESS_WIFI_STATE& /&
&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
在AndroidManifest.xml的Application标签下添加以下内容:
android:name=&c.b.a.A&
android:configChanges=&orientation|keyboardHidden|navigation&
android:exported=&false&
android:screenOrientation=&behind&
android:windowSoftInputMode=&adjustResize|stateHidden& /&
android:name=&c.b.a.B&
android:screenOrientation=&portrait&
android:theme=&@android:style/Theme.Translucent& /&
在您的应用程序主Activity的onCreate中调用如下方法:(Application ID在后台应用管理的 数据浏览-&应用信息-&应用密钥-&Application ID)
BP.init(context,&你的Application ID&);
注意:新版的支付sdk不能被数据服务sdk的初始化方法取代了,无论您是否使用了Bmob数据服务SDK,都要进行支付SDK的初始化
发起支付调用,请使用如下方法:
* 第5个参数为true时调用支付宝支付,为false时调用微信支付
BP.pay(MainActivity.this, &商品名称&, &商品描述&, 0.02, true, new Plistener(){...});
在需要调用订单查询的地方,调用如下方法(微信订单和支付宝订单通用):
BP.query(MainActivity.this, &订单id&, new QListener(){...});
BP.pay(Activity activity, String title, String descript, double money, boolean aliOrWetchat, Plistener listener)
调用支付时的Activity
商品的名称,请注意不要有违禁字眼,可以为空只允许中文、数字、英文和下划线、英文破折号,否则过滤
商品的详情描述,请注意不要有违禁字眼,可以为空只允许中文、数字、英文和下划线、英文破折号,否则过滤
商品的价格,建议测试用0.02
aliOrWetchat
支付方式:true为支付宝支付,false为微信支付
支付结果监听类c.b.PListener有成功、失败、未知结果、返回订单号等方法
注意支付时返回的信息都未必可靠,一切以查询订单返回的信息为准调用微信支付,要安装插件(如果没有安装,会监听器的fail方法会返回-3错误码),插件在sdk文档的plugin文件夹下,demo有通过assets安装的示例
BP.query(Activity activity, String orderId, QListener listener)
调用查询订单时的Activity
支付订单号,不可为空
OrderQueryListener
查询结果监听类c.b.QListener有成功、失败等方法
ForceFree()
当上一次支付操作尚未完成时,如果BmobPay对象发起再次请求,PayListener会回调fail方法返回并10777错误码,以免生成多个订单
如果使用过程中出现了阻塞(比如异常强制关闭支付插件页面,会导致一直不能再发起请求,这是小概率事件),则调用此方法进行BmobPay的重置
仅对下一次请求生效,而不是永久消除限制
c.b.PListener
orderId(String orderId)
无论支付成功与否,只要成功产生了请求,就返回订单号,请自行保存以便以后查询
支付成功,保险起见请调用查询方法确认结果
fail(int code, String reason)
支付失败,有可能是用户中断支付,也有可能是网络问题返回10777时说明上次操作尚未完成,拒绝多次请求以免生成多个订单(可用BP.ForceFree()方法强制取消一次限制)支付宝支付时6001为用户主动中断支付操作微信支付返回-2时为用户主动中断操作,返回-3为未安装Bmob支付插件.apk(如果多次出现异常请向Bmob工作人员反馈)
因为网络等问题,不能确认是否支付成功,请稍后手动查询(小概率事件)
c.b.QListener
succeed(String status)
查询成功(并不是说支付成功),返回的status有NOTPAY和SUCCESS两种可能
fail(int code, String reason)
查询失败,有可能是网络问题,也有可能是订单号错误
错误码列表
微信返回的错误码,可能是未安装微信,也可能是微信没获得网络权限等
微信支付用户中断操作
未安装微信支付插件
设置了安全验证,但是签名或IP不对
支付宝支付用户中断操作
支付宝支付出错,可能是参数有问题
解析服务器返回的数据出错,可能是提交参数有问题
服务器端返回参数出错,可能是提交的参数有问题(如查询的订单号不存在)
解析服务器数据出错,可能是提交参数有问题
查询订单号时未输入订单号
微信客户端未安装
微信客户端版本不支持微信支付
网络异常,可能是没有给应用网络权限
商品名或详情不符合微信/支付宝的规定(如微信商品名不可以超过42个中文)
上次发起的请求还未处理完成,禁止下次请求,可用BP.ForceFree()解除
平时比较需要主动处理到的是-3、、10777支付服务
关于如何使用支付功能,请查看
或 。RestAPI目前只提供了查询订单的功能。查询订单
curl -X GET \
-H &X-Bmob-Application-Id: Your Application ID& \
-H &X-Bmob-REST-API-Key: Your REST API Key& \
/1/pay/Bmob系统生成的订单号
成功返回以下JSON, 失败时返回请看 {
&name&: &商品&,
&body&: &商品详情&,
&create_time&: & 11:14:58&,
&out_trade_no&: &9fa71c6fcfdee38d2b29e4&,
&transaction_id&: &0379&
&pay_type&: &WECHATPAY&,
&total_fee&: 0.01,
&trade_state&: &NOTPAY&
返回的信息简单描述如下:
: 订单或商品名称
body-商品详情
create_time
: 调起支付的时间
out_trade_no
: Bmob系统的订单号
transaction_id : 微信或支付宝的系统订单号
: WECHATPAY(微信支付)或ALIPAY(支付宝支付)
: 订单总金额
trade_state
: NOTPAY(未支付)或 SUCCESS(支付成功)
如图,可以在支付-支付配置处填入通知url。这样在支付成功后会向该url(SDK使用异步通知URL,PHP等调用网页支付的使用同步返回URL)发送post请求,结构如下:{
&trade_status&:&1&,
&out_trade_no&:&ed42ec56bcc&,
&trade_no&:&7152&
trade_status:表示支付状态,目前只有支付成功才产生回调,值恒为1.out_trade_no:Bmob返回的订单号trade_no:支付宝或微信返回的订单号其他
请不要混淆sdk中的任何类和方法名(c.b.和c.b.a.)
在订单管理处,金额从小数点后第三位开始不显示,比如支付了0.01元实收0.00,其实是0.0095
如果用户的手机有“应用锁”功能(即点击应用后跳出系统设定的解锁界面,如小米、360、腾讯管家都可能有该功能),则可能会导致支付中断(支付宝返回6001,微信返回-2),这是微信和支付宝sdk出于安全考虑设置的,请建议用户出现该问题时先关掉支付宝钱包或微信的应用锁
由于微信Sdk的限制,无法判断微信是否已登陆用户,如果未登陆用户,监听器的fail方法可能不被调用,请开发者们提醒自己的用户确保微信已登陆
如果支付宝已经选定了支付用的账户(或银行卡),但是支付失败,用户的支付宝账号会保留该订单,有可能从支付宝官网、支付宝钱包APP再次发起支付,在开发过程中请注意这种事情的处理情况
如果请求支付的页面为横屏,微信支付页面可能出现抽风现象(卡顿甚至重启),是因为微信出现莫名Bug不停开启新支付页面导致内存爆满,解决方法:在AndroidManifest.xml中将com.bmob.pay.tool.PayActivity设为强制竖屏(上方有示例),并尽可能将自己调用的Activity也设置为竖屏
请再次注意:查询监听器的succeed(String status)被调用时并不意味着该订单已经成功支付,而是应该判断status是否为SUCCESS
注意:支付时返回的信息都未必可靠,一切以查询订单返回的信息为准Bmob旨在让移动开发变得更简单。对于一些复杂的应用,您可能希望增加一些特有的业务逻辑,并能灵活掌控,Bmob云端逻辑提供了这种灵活性,可以让您的代码直接在Bmob云上运行。一旦你在云端更新了代码,所有的移动应用都会立即自动更新,新功能的发布将会变得更加简单可控。开源案例
为方便大家更好的使用云端逻辑,Bmob为大家提供了一些常用模块,方便大家直接拿来使用的。
对整个表进行排序: 可结合定时任务使用
获取某行数据对应排行的信息:
获取前N名数据排行信息:
请求生成缩略图:
在开发云端逻辑时,希望大家能够先看看我们提供的编码规范文档:调用云端逻辑的方式
bmob允许以http的方式直接调用云端逻辑。获取Secret Key
用户需要以http的方式运行云端逻辑,需要先确定应用的Secret Key。 调用云端逻辑时,通过Secret Key标识一个应用,获取Secret Key的路径:管理后台-&应用密钥-&Secret Key, 如下图所示:注意:请妥善保管Secret Key,避免Secret Key的泄露!!!以Get的方式调用云端逻辑
下面展示了以Get的方式调用云端逻辑:curl -X GET /bc91d9/test?name=jeff
其中:bc91d9:应用的Secret Key。test:云端逻辑的名称name=jeff: 传入一个参数,名称是name,值是jeff以Post的方式调用云端逻辑
下面展示了以Post的方式调用云端逻辑:curl -X POST \
-H &Content-Type: application/x-www-form-urlencoded& \
-d 'name=jeff' \
/bc91d9/test
其中:bc91d9:应用的Secret Key。test:云端逻辑的名称name=jeff: 传入一个参数,名称是name,值是jeff云端逻辑模块解释
从云端逻辑的入口方法function onRequest(request, response, modules)可知,云端逻辑包含三个模块,分别是request模块、response模块和modules模块。request模块
request模块用于获取传入的参数。由于现在调用云端逻辑有两种方式(get和post),所以获取传入的参数的方式需要使用不同的方法。注意,当通过android,ios等客户端sdk调用云端逻辑,或者通过restful api的方式调用云端逻辑,都是采用post的方式。get方式
用get方式调用云端逻辑,例如:curl -X GET /bc91d9/test?name=jeff
可用下面的方法获取name的值:request.query.name
用post方式调用云端逻辑,例如:curl -X POST \
-H &Content-Type: application/x-www-form-urlencoded& \
-d 'name=jeff' \
/bc91d9/test
可用下面的方法获取name的值:request.body.name
获取调用云端逻辑的http方式
当云端逻辑是用于某些平台的回调时,同一段云端逻辑可能有时是采用get的方式调用,有时是采用post的方式调用。为了方便开发者获取当前云端逻辑的调用方式,新增了模块oHttptype,用于获取当前云端逻辑是采用get还是post方式调用。例子如下:
var httptype = modules.oH //获取调用云端逻辑的是post或者get方式
if (&get& == httptype) {
//采用get方式调用云端逻辑
//采用post方式调用云端逻辑
response模块
response为云端逻辑的信息回传模块,该模块包含了一个send方法,实现将云端的执行结果(如查询的数据)返回给SDK或者RestApi等调用端:response.send(string result)
modules模块
modules是Bmob云端逻辑提供给大家的各种对象处理的模块,包括数据库对象(oData)、文件对象(oFile)、地理位置对象(oLocation)、关联关系对象(oRelation)、原子操作对象(oAtom)、数据批量操作对象(oBatch)、数组对象(oArray)、消息推送对象(oPush)、云端逻辑对象(oFunctions)、邮件发送对象(oMail)、HTTP对象(oHttp)、字符编码转换对象(oEncodeing)、事件对象(oEvent)、bql对象(oBql)、html元素解析对象(oHtmlparser)、加密对象(oCrypto)。云端逻辑想要调用这些对象时,只需要用如下的方法即可获取:
//获取数据库对象
var db = modules.oD
//下面进行其他操作
这里需要说明一点的是:云端逻辑对数据格式的封装遵循RestApi的规则,如果在查看过程中有什么疑问,请移步到。 数据库对象
数据库操作的简单实例如下:function onRequest(request, response, modules) {
//获取数据库对象
var db = modules.oD
//获取Posts表中的所有值
&table&:&Posts&,
},function(err,data){
response.send(data);
其中,Posts是查找的数据表名称,table是关键词。需要注意的是,Bmob云端逻辑底层采用Nodejs进行开发,继承了Nodejs的异步非阻塞事件驱动模式,因此也不可避免的需要大量使用回调方法,这些方法往往以非显式声明的闭包形式存在。此外,通过oData数据库对象获取返回的回调接口中,所有的data数据都是string类型,如果需要在云端中作为对象类型调用的话,需要将string类型转换为object类型,即:
var dataObject= JSON.parse(data);
oData对象的其他操作方法如下:### 查询多条数据find({
&table&:&XXX&,
&keys&:&a,b,c&,
//返回字段列表,多个字段用,分隔
&where&:{&a&:&XXXX&,&b&:&XXXX&},
//查询条件是一个JSON object
&order&:&-a,b&,
//排序列表,[-]字段名称,-表示降序,默认为升序
&limit&:10,
//limit大小,一页返回多少条记录,默认为0
//skip,分页offset,(page-1)*limit
//count,只返回符合条件的记录总数
},function(err,data){
//回调函数
以下是读取Games表(包含name字段)的数据,并对这些数据进行遍历,将name字段连接起来的一段代码样例:function onRequest(request, response, modules) {
var db = modules.oD
&table&:&Games&
},function(err,data){
//将返回结果转换为Json对象
var resultObject= JSON.parse(data);
//遍历这个Json对象
for(var results in resultObject)
var resultArr = resultObject[results];
var str =& &;
//遍历得到的每行结果
for(var oneline in resultArr){
str =str +& & + resultArr[oneline].
response.send(str);
查询单条数据
&table&:&XXX&,
&objectId&:&XXXX&
//记录的objectId
},function(err,data){
//回调函数
需要注意的是:
为确保User表的安全性,findOne方法不能直接操作User表。
find方法返回的data是字符串类型,如果需要直接对象化调用的话,需要将string类型转换为object类型,即如下,从_User表中查找objectId=YIuNDDDO的数据,并把username信息显示出来:function onRequest(request, response, modules) {
var db = modules.oD
db.findOne({
&table&:&_User&,
&objectId&:&YIuNDDDO&
},function(err,data){
var dataObject= JSON.parse(data);
response.send(&获取用户名信息为: & + dataObject.username);
获取表的记录数
function onRequest(request, response, modules) {
var db = modules.oD
//获取表&GameScore&的总记录数
&table&:&GameScore&,
&limit&:0,
},function(err,data){
resultObject= JSON.parse(data);
count=resultObject.
response.send(&表记录数:&+count);
其中,count为标识位,具体原因大家可以参考Restapi说明文档:。修改数据
&table&:&XXX&,
&objectId&:&XXXX&,
//记录的objectId
&data&:{&a&:&XXXX&,&b&:&XXXX&}
//需要更新的数据,格式为JSON
},function(err,data){
//回调函数
以下是一个更新数据的示例代码,实现的效果是从Games表中找到objectId=hmw9888C的数据,将其name数据改为pingpang games。function onRequest(request, response, modules) {
var db = modules.oD
db.update({
&table&:&Games&,
&objectId&:&hmw9888C&,
&data&:{&name&:&pingpang games&}
},function(err,data){
response.send(&success&);
&table&:&XXX&,
&data&:{&a&:&XXXX&,&b&:&XXXX&}
//需要更新的数据,格式为JSON
},function(err,data){
//回调函数
&table&:&XXX&,
&objectId&:&XXXX&
//记录的objectId
},function(err,data){
//回调函数
userSignUp({
&data&:{&a&:&XXXX&,&b&:&XXXX&}
//用户注册的信息,格式为JSON
},function(err,data){
//回调函数
userLogin({
&username&:&aa&,
//登录用户名
&password&:&&
//用户密码
},function(err,data){
//回调函数
用户密码重置
userRestPassword({
&data&:{&email&:&&}
//需要重置密码的用户邮件账号
},function(err,data){
//回调函数
获取某一用户记录
getUserByObjectId({
&objectId&:&XXXX&
//记录的objectId
},function(err,data){
//回调函数
更新某一用户记录
说明:必须先登录才能更新,切记!!!否则会报sessionToken errorupdateUserByObjectId({
&objectId&:&XXXX&,
//记录的objectId
&data&:{&a&:&XXXX&,&b&:&XXXX&}
//需要更新的数据,格式为JSON
},function(err,data){
//回调函数
以下是更新用户信息的示例代码:function onRequest(request, response, modules) {
var db = modules.oD
db.userLogin({
&username&:&123567&,
&password&:&123&
},function(err, data){
var dataObject = JSON.parse(data);
if(dataObject.error == null){
//需要设置登录之后获取的sessionToken头信息
db.setHeader({&x-bmob-session-token&:dataObject.sessionToken});
db.updateUserByObjectId({&objectId&:dataObject.objectId ,data:{&username&:&123&}},function(err,data){
response.send(&更新成功&);
response.send(&找不到该用户!&);
获得所有用户信息
getAllUser(function(err,data){
//回调函数
删除某一个指定用户
说明:必须登录才行,切记!!!否则会报sessionToken errorremoveUserByObjectId({
&objectId&:&XXXX&
//记录的objectId
},function(err,data){
//回调函数
发送给用户的邮箱验证的邮件会在一周内失效,可以通过下面的方法来强制重新发送requestEmailVerify({
&data&:{&email&:&&}
},function(err,data){
//回调函数
这里有一个小技巧分享给大家,有时候你会希望能够用Master Key(Bmob给大家提供的超级权限,可以对数据进行任何操作)对数据进行操作,包括不需要用户登录就可以修改用户信息等。那么你只需要在对数据进行操作前,通过db.setHeader方法设置下Master Key头信息即可,如下:function onRequest(request, response, modules) {
var db = modules.oD
db.setHeader({&X-Bmob-Master-Key&:&这里填写Master Key信息&});
db.updateUserByObjectId({&objectId&:&这里是需要更新的用户ObjectId信息& ,data:{&username&:&123&}},function(err,data){
response.send(&更新成功&);
云端逻辑只支持文件的删除操作。删除文件,必须要知道文件的组名和url,示例代码如下:function onRequest(request, response, modules) {
var file = modules.oF
file.del({
&group&:&group1&,
&url&:&M00/00/01/wKgBP1N3FAWRJXsSAAAB_rYZATs52.html&
},function(err,data){
//回调函数
在上面的例子中,group1是组名,M00/00/01/wKgBP1N3FAWRJXsSAAAB_rYZATs52.html是url。返回结果是个json对象:{
&msg&: &delete file success&
云端逻辑对象
在云端逻辑中可以调用本app的其它云端逻辑,示例代码如下:function onRequest(request, response, modules) {
var functions = modules.oF
functions.run({
&name&: &test&,
&data&:{&content&:&你好&,&address&:&guangzhou&}
},function(err,data){
//回调函数
在上面的例子中,name是云端逻辑的函数名,data中是传递的参数如果不需要传递任何参数,可以用下面的实例代码:function onRequest(request, response, modules) {
var functions = modules.oF
functions.run({
&name&: &test&
},function(err,data){
//回调函数
地理位置对象
Bmob允许用户根据地球的经度和纬度坐标进行基于地理位置的信息查询。你可以在查询中添加一个GeoPoint的对象查询。您可以实现轻松查找出离当前用户最接近的信息或地点的功能。创建地理位置
创建地理位置的示例代码如下:function onRequest(request, response, modules) {
var location = modules.oL
location.create({
&table&:&GameScore&,
&objectId&:&j4w2DDDT&,
&data&:{&location&:{
&__type&: &GeoPoint&,
&latitude&:
12.934755,
&longitude&: 24.52065
},function(err,data){
//回调函数
查询地理位置
现在您有一系列的对象对应的地理坐标,如果能发现那些对象离指定的点近就好了,这可以通过GeoPoint数据类型加上在查询中使用$nearSphere做到。获取离用户最近的10个地点的实现代码如下:
location.query({
&table&:&GameScore&,
&limit&:10,
&location&: {
&$nearSphere&: {
&__type&: &GeoPoint&,
&latitude&: 30.0,
&longitude&: 20.0
},function(err,data){
//回调函数
这会按离纬度30.0,经度-20.0的距离排序返回一系列的结果,第一个就是最近的对象。(注意如果一个特定的order参数给了的话,它会覆盖按距离排序),例如,下面是两个上面的查询返回的结果:{
&results&: [
&location&: {
&__type&: &GeoPoint&,
&latitude&: 40.0,
&longitude&: -30.0
&updatedAt&: & 22:36:04&,
&createdAt&: & 22:36:04&,
&objectId&: &e1kXT22L&
&location&: {
&__type&: &GeoPoint&,
&latitude&: 30.0,
&longitude&: 20.0
&updatedAt&: & 22:36:26&,
&createdAt&: & 22:36:26&,
&objectId&: &51e3a2a8e4b015ead4d95dd9&
为了限定搜素的最大举例,需要加入$maxDistanceInMiles和$maxDistanceInKilometers或者$maxDistanceInRadians参数来限定。如,要找半径在10公里内的数据的实现代码如下:
location.query({
&table&:&GameScore&,
&limit&:10,
&location&: {
&$nearSphere&: {
&__type&: &GeoPoint&,
&latitude&: 30.0,
&longitude&: 20.0
&$maxDistanceInKilometers&: 10.0
},function(err,data){
//回调函数
同样做查询寻找在一个特定的范围里面的对象也是可以的,为了找到在一个矩形的区域里的对象,按下面的格式加入一个约束 {&$within&: {&$box&: {[southwestGeoPoint, northeastGeoPoint]}}},下面是一段示例代码:
location.query({
&table&:&GameScore&,
&limit&:10,
&location&: {
&$within&: {
&__type&: &GeoPoint&,
&latitude&: 37.71,
&longitude&: 22.53
&__type&: &GeoPoint&,
&latitude&: 30.82,
&longitude&: 22.37
},function(err,data){
//回调函数
关联关系对象
一个对象可以与其他对象相联系。就像数据库中的主外键关系一样,数据表 A 的某一个字段是数据表 B 的外键,只有表 B 中存在的数据才可插入进表 A 中的字段。 添加关联关系
为了更新 Pointer 的Key类型,Bmob提供特殊的操作来原子化地添加和删除一个指针,我们可以像这样添加一行记录时并添加一个指针:function onRequest(request, response, modules) {
var rel = modules.oR
&table&:&GameScore&,
&data&:{&game&:{&__type&:&Pointer&,&className&:&Game&,&objectId&:&ekZq111a&}}
},function(err,data){
//回调函数
为了更新 Relation 的Key类型,Bmob提供特殊的操作来原子化地添加和删除一个或多个关系,我们可以像这样添加一行记录时并添加多个关系:
&table&:&GameScore&,
&data&:{&gamerel&:{&__op&:&AddRelation&,&objects&:[{&__type&:&Pointer&,&className&:&Game&,&objectId&:&ekZq111a&},{&__type&:&Pointer&,&className&:&Game&,&objectId&:&80SLHHHj&}]}}
},function(err,data){
//回调函数
修改关联对象
为了更新 Pointer 的Key类型,Bmob提供特殊的操作来原子化地添加和删除一个指针,我们可以像这样添加一个指针:
rel.update({
&table&:&GameScore&,
&objectId&:&e&,
&data&:{&game&:{&__type&:&Pointer&,&className&:&Game&,&objectId&:&80SLHHHj&}}
},function(err,data){
//回调函数
为了更新 Relation 的Key类型,Bmob提供特殊的操作来原子化地添加和删除一个或多个关系,我们可以像这样添加多个关系:
rel.update({
&table&:&GameScore&,
&objectId&:&e&,
&data&:{&gamerel&:{&__op&:&AddRelation&,&objects&:[{&__type&:&Pointer&,&className&:&Game&,&objectId&:&ekZq111a&}]}}
},function(err,data){
//回调函数
查询关联对象
有几种方式来对关系 Relation 或 指针 Pointer 类型数据进行查询, 如果您将要获取对象中有个Key类型是关系 Relation 或 指针 Pointer,这都说明你要获取的对象是匹配到另一个特殊(关联或指向)的对象的, 您可以用一个 where 参数查询, 自己使用 __type 构造一个 Pointer, 就像你构造其他数据类型一样。举例说, 如果每一条评论(Comment对象)有一个Key叫post,类型是Pointer,并且指向了一个具体的帖子(Post对象,用objectId表示一个帖子),那么您可以使用下面的请求获取一个帖子的所有评论:rel.query({
&table&:&Comment&,
&where&:{&post&:{&__type&:&Pointer&,&className&:&Post&,&objectId&:&l4fQ999O&}},
},function(err,data){
//回调函数
如果您想要获取对象, 这些对象的一个字段指向的对象是符合另一个查询的, 您可以使用 $inQuery 操作符,注意默认的 limit 是 100 而且最大的 limit 是 1000,这个限制同样适用于内部的查询, 所以对于较大的数据集您可能需要细心地构建查询来获得期望的行为。举例说, 假设您有一个 帖子(Post)类和一个评论(Comment)类, 每个评论(Comment)都有一个指向它的帖子(Post)的关系Key名为post,并且类型为Pointer, 您可以找到所有有图片的帖子(Post)的评论(Comment):rel.query({
&table&:&Comment&,
&where&:{&post&:{&$inQuery&:{&where&:{&image&:{&$exists&:true}},&className&:&Post&}}},
},function(err,data){
//回调函数
同理,使用下面的请求,您可以找到所有没有图片的帖子(Post)的评论(Comment):rel.query({
&table&:&Comment&,
&where&:{&post&:{&$notInQuery&:{&where&:{&image&:{&$exists&:true}},&className&:&Post&}}},
},function(err,data){
//回调函数
如果您想获取的对象,是其父对象的关系 Relation 类型的Key的所有成员的话, 您可以使用 $relatedTo 操作符, 假设您有一个帖子(Post)类和一个系统默认的用户(_User)类, 而每一个帖子(Post)都可以被不同的用户(_User)所喜欢。 如果帖子(Post)类下面有一个Key名为likes,且是 Relation 类型, 存储了喜欢这个帖子(Post)的用户(_User)。那么您可以找到喜欢过同一个指定的帖子(Post)的所有用户:rel.query({
&table&:&users&,
&where&:{&$relatedTo&:{&object&:{&__type&:&Pointer&,&className&:&Post&,&objectId&:&l4fQ999O&},&key&:&likes&}},
},function(err,data){
//回调函数
还可以使用组合查询,比如下面这样,判断用户是否喜欢(likes)过这个帖子:rel.query({
&table&:&Comment&,
&where&:{&likes&:{&$inQuery&:{&where&:{&objectId&:&l3xRGGGa&},&className&:&_User&}}, &objectId&:&l4fQ999O&},
&limit&:10,
&count&:true
},function(err,data){
//回调函数
返回结果集如下:{
results: [ ]
你可以做如下判断,如果count=1,表明用户喜欢的这个帖子objectId存在,即用户喜欢过这个帖子;若count=0, 表明用户没有喜欢过这个帖子。在某些情况之下,您可能需要在一个查询之中返回关联对象的多种类型,您可以通过传入字段名称到include参数中,多个字段名称用,间隔, 比如,我们想获得最近的10篇评论,而您想同时得到它们相关的post:include的Key必须是Pointer类型rel.query({
&table&:&Comment&,
&order&:&-createdAt&,
&limit&:10,
&include&:&post&
},function(err,data){
//回调函数
不是作为一个 Pointer 类型表示,post字段现在已经被展开为一个完整的帖子(Post)对象, __type 被设置为 Object 而 className 同样也被提供了。 举例说, 一个指向帖子(Post)的Pointer原本展示为:{
&__type&: &Pointer&,
&className&: &Post&,
&objectId&: &51e3a359e4b015ead4d95ddc&
当一个查询使用include参数来包含进去来取代 Pointer 之后,可以看到 Pointer 被展开为:{
&__type&: &Object&,
&className&: &Post&,
&objectId&: &51e3a359e4b015ead4d95ddc&,
&createdAt&: &T20:59:34.428Z&,
&updatedAt&: &T20:59:34.428Z&,
&otherFields&: &willAlsoBeIncluded&
您可以同样做多层的include, 这时要使用 &.& 号. 如果您要include一条评论(Comment)对应的帖子(Post)的作者(author):include的Key必须是Pointer类型rel.query({
&table&:&Comment&,
&order&:&-createdAt&,
&limit&:10,
&include&:&post.author&
},function(err,data){
//回调函数
删除关联关系
可以在一个对象中删除一个关系:
rel.delete({
&table&:&GameScore&,
&objectId&:&e&,
&data&:{&gamerel&:{&__op&:&RemoveRelation&,&objects&:[{&__type&:&Pointer&,&className&:&Game&,&objectId&:&ekZq111a&}]}}
},function(err,data){
//回调函数
原子操作对象
很多应用可能会有需要计数器的功能,比如某条信息被点赞多少次等。Bmob提供了非常便捷的方式来保证原子性的修改某一数值字段的值,示例代码如下:function onRequest(request, response, modules) {
//获取原子操作对象
var atom = modules.oA
//score增加一个固定值操作
atom.exec({
&table&:&GameScore&,
&objectId&:&j4w2DDDT&,
&data&:{&score&:{&__op&:&Increment&,&amount&:1}}
},function(err,data){
//回调函数
function onRequest(request, response, modules) {
//获取原子操作对象
var atom = modules.oA
//score减少一个固定值操作
atom.exec({
&table&:&GameScore&,
&objectId&:&j4w2DDDT&,
&data&:{&score&:{&__op&:&Increment&,&amount&:-1}}
},function(err,data){
//回调函数
批量操作对象
为了减少因为网络通讯次数太多而带来的时间浪费, 您使用使用下面的批量(batch)操作,在一个请求中对多个普通对象(不支持系统内置的用户对象)进行添加(create)、更新(update)、删除(delete) 操作,上限为50个。function onRequest(request, response, modules) {
//获取数组对象
var bat = modules.oB
//批量操作
bat.exec({
&requests&: [
&method&: &POST&,
&path&: &/1/classes/GameScore&,
&score&: 1337,
&playerName&: &Sean Plott&
&method&: &POST&,
&path&: &/1/classes/GameScore&,
&score&: 1338,
&playerName&: &ZeroCool&
},function(err,data){
//回调函数
批量操作的响应会是一个列表, 列表的返回值个数同给定的requests请求个数是相等的。列表中每个返回项都有一个字段是 &success& 或者 &error&, &success& 的值是通常是和你进行其他REST操作成功时返回的值是一样的:{
&success&: {
&createdAt&: &T16:59:11.276Z&,
&objectId&: &51c3ba67e4b0f0e851c16221&
&error& 的值是有返回码和错误信息字符串的一个对象:{
&error&: {
&code&: 101,
&error&: &object not found for delete&
在 batch 操作中更新(update)和删除(delete)同样是有效的:function onRequest(request, response, modules) {
//获取数组对象
var bat = modules.oB
//批量操作
bat.exec({
&requests&: [
&method&: &PUT&,
&path&: &/1/classes/GameScore/51e3a334e4b0b3eb44adbe1a&,
&score&: 999999
&method&: &DELETE&,
&path&: &/1/classes/GameScore/51a8a4d9e4b0d034f6159a35&
},function(err,data){
//回调函数
数组操作对象
用下面的方法来获取数组对象:
var arr = modules.oA
添加数组对象
添加数组对象,不管元素是否存在都添加的实现代码如下:
&table&:&GameScore&,
&data&:{&skills&:{&__op&:&Add&,&objects&:[&flying&,&kungfu&]}}
},function(err,data){
//回调函数
添加数组对象,只有在元素不存在情况下才添加的实现代码如下:
//往GameScore表中字段skills添加的数组
arr.addUnique({
&table&:&GameScore&,
&objectId&:&j4w2DDDT&,
&data&:{&skills&:{&__op&:&AddUnique&,&objects&:[&flying&,&kungfu&]}}
},function(err,data){
//回调函数
删除数组对象
//往GameScore表中字段skills删除数组
arr.remove({
&table&:&GameScore&,
&objectId&:&j4w2DDDT&,
&data&:{&skills&:{&__op&:&Remove&,&objects&:[&flying&,&kungfu&]}}
},function(err,data){
//回调函数
查询数组对象
查询数组对象,可以查找skills的数组值中包含有&flying&的对象的实现方法如下:
//往GameScore表中字段skills添加的数组
arr.query({
&table&:&GameScore&,
&where&:{&skills&:&flying&}
},function(err,data){
//回调函数
查询数组对象,可以查找skills的数组值中包含有&flying&,&kungfu&的对象的实现方法如下:
//往GameScore表中字段skills添加的数组
arr.query({
&table&:&GameScore&,
&where&:{&skills&:{&$all&:[&flying&,&kungfu&]}}
},function(err,data){
//回调函数
消息推送对象
推送通知是让用户及时被通知、和你的应用保持联系的一种非常棒的方式,你可以快速而有效地通知到所有的用户,下面这个教程将会教会你使用Bmob来推送消息。用下面的方法来获取消息推送对象:
var push = modules.oP
安装消息推送服务
每一个Bmob的App安装在用户设备后,如果要使用消息推送功能,Bmob SDK会自动生成一个Installation对象。Installation对象包含了推送所需要的所有信息。举例:一个棒球的App,你可以让用户订阅感兴趣的棒球队,然后及时将这个球队的消息推送给用户 。Installation对象有几个系统默认的特殊字段来帮助你的管理和定位到设备:
badge : iOS应用中右上角的图标标识
channels : 当前这个设备订阅的渠道名称数组
timeZone : 设备所在位置的时区, 如Asia/Shanghai,这个会在每个Installation对象更新时同步(只读)
deviceType : 设备的的类型, 值为:&ios& 或 &android& (只读)
installationId : Bmob使用的设备唯一号,Android设备是必须的,iOS可选 (只读)
deviceToken : iOS设备由Apple APNS生成的唯一性token标识 (只读)
保存installation
保存iOS设备的deviceToken
iOS设备通常使用deviceToken来惟一标识一台设备。
push.add({
&deviceType&: &ios&,
&deviceToken&: &abcdefabcdefabcdefabcdef&,
&channels&: [
},function(err,data){
//回调函数
保存Android设备的installationId
对于Android设备,SDK会自动生成uuid作为installationId保存到Bmob。 您可以使用以下云端逻辑保存Android设备的installation ID:
push.add({
&deviceType&: &android&,
&installationId&: &2-ab&,
&channels&: [
},function(err,data){
//回调函数
你还可以更新Installation对象的更多属性,用来查询installationId,定制更通用的推送:
push.update({
&objectId&:&400a12ed3a&,
&scores&: true,
&gameResults&: true,
&injuryReports&: true
},function(err,data){
//回调函数
保存Windows Phone设备的 notificationUri
对于Windows Phone设备,BmobSDK会自动从Windows Push Center获取到notificationUri并保存到 Bmob。 你可以使用以下REST API保存Windows Phone设备的notificationUri:
push.add({
&deviceType&: &windows phone&,
&notificationUri&: &https://hk1.notify.live.net/unthrottledthirdparty/01.00/AQHgHh6EuwNtTa1TbwvaAjnmAgAAAAADEAAAAAQUZm52OkZDM0U5RDkxQzIzREJBNDYFBkFTRUEwMQ&,
&channels&: [
},function(err,data){
//回调函数
订阅频道和退订
覆盖已订阅的频道:
push.update({
&objectId&:&400a12ed3a&,
&channels&: [
},function(err,data){
//回调函数
订阅一个新频道,不覆盖已订阅的频道:
push.update({
&objectId&:&400a12ed3a&,
&channels&:{&__op&:&AddUnique&,&objects&:[&Giants111&]}
},function(err,data){
//回调函数
push.update({
&objectId&:&400a12ed3a&,
&channels&:{&__op&:&Remove&,&objects&:[&Giants&,&Mets&]}
},function(err,data){
//回调函数
广播推送消息
push.send({
&alert&: &Hello From Bmob.&
},function(err,data){
//回调函数
组播推送消息
发送给订阅了Giants频道的用户
push.send({
&channels&:[&Giants&]
&alert&: &Hello From Bmob.&
},function(err,data){删除数据
//回调函数
或者更简便的方式
push.send({
&channels&:[&Giants&],
&alert&: &Hello From Bmob.&
},function(err,data){
//回调函数
多播推送消息
推送给不活跃的用户
push.send({
&updatedAt&:{
&$lt&:{&__type&:&Date&,&iso&:& 11:33:53&}
&alert&: &Hello From Bmob.&
},function(err,data){
//回调函数
根据查询条件做推送
push.send({
&where&: {
&scores&: true
&alert&: &Willie Hayes injured by own pop fly.&
},function(err,data){
//回调函数
请注意,where 条件查询的都是 installations 表。这里是假设 installations 表存储了 scores 的布尔属性,你可以像查询普通对象一样构造where查询根据平台做推送
push.send({
&where&: {
&deviceType&: &android&
&alert&: &Your suitcase has been filled with tiny robots!&
},function(err,data){
//回调函数
push.send({
&where&: {
&deviceType&: &ios&
&alert&: &Your suitcase has been filled with tiny robots!&
},function(err,data){
//回调函数
根据地理信息位置做推送
push.send({
&where&: {
&$inQuery&: {
&location&: {
&$nearSphere&: {
&__type&: &GeoPoint&,
&latitude&: 30.0,
&longitude&: -20.0
&$maxDistanceInMiles&: 1.0
&alert&: &Free hotdogs at the bmob concession stand!&
},function(err,data){
//回调函数
上面的例子假设 installation 有个 user 属性指向_User 表的记录,并且用户有个 location 属性是 GeoPoint 类型,我们就可以根据地理信息位置做推送。点播推送消息
发送给Android单个客户端
push.send({
&installationId&:&2-ab&
&alert&: &Hello From Bmob.&
},function(err,data){
//回调函数
发送给iOS单个客户端
push.send({
&deviceToken&:&abcdefabcdefabcdefabcdef&
&alert&: &Hello From Bmob.&
},function(err,data){
//回调函数
发送选项设置
推送通知不仅仅可以用来发送消息,iOS中,推送内容还可以包含要播放的声音和要显示的badge数字值,还可以定制任何你想发送的内容,对于Android,你甚至可以指定Intent应用于接收消息,对于时间性有要求的消息您还可以设置一个消息过期时间。定制您的通知
如果你想发送更多的消息,你可以在data的字典对象中设置其他字段,下面这些保留的字段有其特殊的意义:
alert : 通知的消息内容
badge : (仅iOS)一个数字值将会高亮显示在应用图标的右上角
sound : (仅iOS)应用绑定包中的声音文件
content-available : (仅iOS)如果你的应用是新闻类的,或者你的应用正在使用iOS7的Remote Notification Background Mode,设定这个值为1将为触发离线下载功能。
action : (仅Android)接收到推送消息时应用Intent,如果没有指定title或alert,Intent将被应用,但是没有通知呈现给用户。
title : (仅Android)这个值将显示在系统通知栏
例如,推送一条通知,将当前的badge值自增1,并且播放iOS设备上定制的音乐,对于Android用户,将在系统通知栏中显示特殊的标题,则请求如下:
push.send({
&channels&: [
&alert&: &The Mets scored! The game is now tied 1-1.&,
&badge&: 1,
&sound&: &cheering.caf&,
&title&: &Mets Score!&
},function(err,data){
//回调函数
当然,你也可以在data字典对象中定制自己的字段,推送消息,但不显示在 Andoid 系统的通知栏中,而是执行应用程序预定义的逻辑,Android或iOS接收消息文档中对此有说明,iOS只有当用户从通知中打开应用,才能访问data的数据,Android将提供这个数据在action Intent应用之后,
push.send({
&channels&: [
&alert&: &The Mets scored! The game is now tied 1-1.&,
&badge&: &Increment&,
&sound&: &cheering.caf&,
&title&: &Mets Score!&
},function(err,data){
//回调函数
设置消息过期时间
过期时间,可以是绝对时间:
push.send({
&expiration_time&: & 00:51:13&,
&alert&: &Season tickets on sale until December
},function(err,data){
//回调函数
也可以是相对时间(根据push_time做定期推送,从push_time时间开始算起,直到expiration_interval时间后过期),下面请求表示消息将在 00:51:13这个时间点开始推送,直到7天后过期:
push.send({
&push_time&: & 00:51:13&,
&expiration_interval&: 518400,
&alert&: &Season tickets on sale until December
},function(err,data){
//回调函数
邮件发送对象
Bmob的邮件发送对象采用Nodejs提供的nodemailer模块,这里提供简单的一个发送邮件的操作实例。更多的功能详细参考:function onRequest(request, response, modules) {
//获得发送邮件的对象
var mailer = modules.oM
//设置发送服务器信息
transport = mailer.createTransport( &SMTP& , {
host: && ,
secureConnection: true , // use SSL
port: 465, // port for secure SMTP
user: &&, //设置发送邮箱帐号
pass: &xxx& //设置发送邮箱密码
transport.sendMail({
from : && ,
subject: &主题& ,
generateTextFromHTML : true ,
html : &啊哈哈哈&
}, function (error, responseback){
transport.close();
if(error){
//发送失败
//发送成功
response.send(&发送成功&);
HTTP请求对象
oHttp对象可以模拟实现get、post、put、delete等各种HTTP请求信息,让你在云端实现诸如数据采集、OAuth授权登录等功能。Bmob的HTTP请求模块采用Nodejs提供的request模块,这里提供简单的Get和Post的操作实例。更多的功能详细参考:/**
*发起Get请求
//获取Http模块
var http = modules.oH
//发起Get请求
http('', function (error, res, body) {
if (!error && res.statusCode == 200) {
response.send(body);
*发起Post请求
//获取Http模块
var http = modules.oH
//往/save发起POST请求
http.post('/save', {form:{key:'value'}})
oEvent,也就是eventproxy模块,解决异步回调的问题。更多的功能详细参考:function onRequest(request, response, modules) {
var ep = modules.oE
//eventproxy模块,解决异步回调的问题
ep.after('got_file', 3, function (list) {
response.send(&len:&+list.length);
//发送3次事件后触发事件,输出list的长度
ep.emit(&got_file&, &1&);
ep.emit(&got_file&, &1&);
ep.emit(&got_file&, &1&);
Encode编码转换对象
Encode对象可以实现字符编码的转换。更多的功能详细参考:Encode对象就一个方法convert(),使用方法为:encoding.convert(text, toCharset, fromCharset)。text: 需要转换的对象,可以为Buffer或者String对象。toCharset: 转换后的编码。fromCharset: 转换前的编码,缺省为uft8。转换后的输入结果为Buffer对象。var encoding = modules.oE
var result = encoding.convert(&禅&,&gbk&,&utf8&);
response.send(result.toString());
html元素解析对象(oHtmlparser)
html元素解析对象可以实现html的解释。更多的功能详细参考:代码例子function onRequest(request, response, modules) {
var htmlparser = modules.oH
var rawHtml = &&a href='test.html'&xxx&/a&&;
var handler = new htmlparser.DefaultHandler(function (error, dom) {});
var parser = new htmlparser.Parser(handler);
parser.parseComplete(rawHtml);
response.send(JSON.stringify(handler.dom, null, 2));
代码的输出:[
&raw&: &a href='test.html'&,
&data&: &a href='test.html'&,
&type&: &tag&,
&name&: &a&,
&attribs&: {
&href&: &test.html&
&children&: [
&raw&: &xxx&,
&data&: &xxx&,
&type&: &text&
bql对象(oBql)
我们提供类 SQL 语法的 BQL 查询语言来查询数据下面的代码例子就是查询GameScore表的所有数据function onRequest(request, response, modules) {
//获得bql的对象
var Bql = modules.oB
Bql.exec({
&bql&:&select * from GameScore&
},function(err,data){
response.send(data);
BQL 还支持占位符查询,where 和 limit 子句的条件参数可以使用问号替换,然后通过 values 数组传入:function onRequest(request, response, modules) {
//获得发送邮件的对象
var Bql = modules.oB
Bql.exec({
&bql&:&select * from GameScore where name=? limit ?,? &,
&values&:&[\&tom\&,0,100]&
},function(err,data){
response.send(data);
//回调函数
更多请参考
。加密对象(oCrypto)
提供md5和sha1两种加密算法。更多的功能详细参考:代码例子
function onRequest(request, response, modules) {
var crypto = modules.oC
var md5 = crypto.createHash('md5');
md5.update(&hello&); //输入要md5的内容
response.send(md5.digest('hex'));//以16进制编码
云端逻辑调试工具
为方便开发者调试云端逻辑,Bmob为开发者提供了便捷的云端调试工具,你可以直接在云端逻辑的编辑页面下对编写的代码进行调试,如实现从Bar表中查找指定objectId号(SDK中上传参数)的数据,你可以在云端逻辑中实现如下:function onRequest(request, response, modules) {
var db = modules.oD
db.findOne({
&table&:&Bar&,
&objectId&:request.body.objectId
},function(err,data){ //回调函数
response.send(&成功 & + data);
调试时,你在云端调试工具中输入参数名为objectId,参数值为你想要查询的信息,如下图,即可查看到调试结果。错误对象
Bmob提供的官方模块(非第三方)的错误回调中都会有一个err对象,这个err对象包含两个属性:error和code,分别代表错误异常信息和错误代码。调用时可以简单如下使用:function onRequest(request, response, modules) {
var db = modules.oD
db.findOne({
&table&:&YourTableName&,
&objectId&:request.body.oid
},function(err,data){
//对返回结果进行处理
response.send(&error is
& + err.code
+ &error message is & + err.error );
else response.send(data);

我要回帖

更多关于 bmob添加数据 的文章

 

随机推荐