获取用户信息

let MyUser = new BaaS.User()

获取指定用户信息

MyUser.get(userID)

参数说明

参数类型必填说明
userIDNumber用户 ID (对应 _userprofile 表中的 id 字段)

返回字段说明

参数类型说明
avatarString用户头像
cityString用户所在城市
countryString用户所在国家
genderString用户的性别,值为 1 时是男性,值为 2 时是女性,值为 0 时是未知
idNumber用户 ID (对应 _userprofile 表中的 id 字段)
languageString用户的语言,简体中文为 zh_CN
nicknameString用户昵称
openidString用户唯一标识,由微信生成
provinceString用户所在省份
unionidString用户在开放平台的唯一标识符,由微信生成
_emailString用户邮箱(用于用户以邮箱 & 密码登录)
_usernameString用户名(用于用户以用户名 & 密码登录)
_email_verifiedBoolean用户邮箱是否已经通过验证(已验证邮箱才能找回密码)
_providerObject用户在平台方的用户信息
_provider.alipayObject支付宝平台的用户信息,见下方说明

支付宝平台的用户信息对象说明

参数类型说明
user_idstring支付宝小程序用户 user_id
is_studentboolean用户是否是学生
user_typestring用户类型,包括:company_account(公司账户)以及 personal_account (个人账户)
user_statusboolean用户状态,包括:registered(快速注册用户)、authenticated(已认证用户)、frozen(被冻结用户) 以及inactive(已注册,未激活用户)
verifiedboolean用户是否通过实名认证,当且仅当该值为 true 时gender 值才保证准确性
avatarstring支付宝小程序用户头像
provincestring支付宝小程序用户省份
citystring支付宝小程序用户市名称
nicknamestring支付宝小程序用户昵称
genderstring支付宝小程序用户性别,female 为女性,male 为男性

如果有自定义字段,则一并返回

请求示例

  1. let MyUser = new BaaS.User()
  2. let userID = 36395395
  3. MyUser.get(userID).then(res => {
  4. // success
  5. }, err => {
  6. // err
  7. })

返回示例

  1. {
  2. "status": 200,
  3. "data": {
  4. "id": 5123461461,
  5. "avatar": "http://cdn.ifanr.cn/ifanr/default_avatar.png",
  6. "nickname": "riDGldYXLHouWIYx",
  7. "_username": "myusername",
  8. "_email": "myemail@somemail.com",
  9. "_email_verified": false,
  10. "_provider": {
  11. "alipay": {
  12. "avatar": "http://tfsimg.alipay.com/images/partner/T1uIxXXbpXXXXXXXX",
  13. "province": "安徽省",
  14. "city": "安庆",
  15. "nick_name": "支付宝小二",
  16. "is_student": true,
  17. "user_type": "company_account",
  18. "user_status": "authenticated",
  19. "verified": true,
  20. "gender": "female"
  21. }
  22. }
  23. }
  24. }

筛选返回字段

select 使用方法可以参考数据表 - 字段过滤小节

扩展字段

expand 使用方法可以参考数据表 - 字段扩展小节

请求示例

假设 _userprofile 表中有一个类型为 pointer 的字段,名称为 pointer_test_oder, 指向了 test_order 表

  1. let MyUser = new BaaS.User()
  2. MyUser.expand(['pointer_test_oder']).select(['nickname', 'pointer_test_order']).get(123456).then((res) => {
  3. // success
  4. }, (err) => {
  5. // err
  6. })

请求结果

  1. {
  2. "status": 200,
  3. "data": {
  4. "pointer_test_order": {
  5. "created_at": 1538966895,
  6. "_table": "test_order",
  7. "id": "5bbac56fbd66033df7fd0aa2",
  8. "created_by": 61736923,
  9. "updated_at": 1538966895
  10. },
  11. "nickname": "ifanrx"
  12. }
  13. }
  1. let MyUser = new wx.BaaS.User()
  2. MyUser.expand(['pointer_test_oder']).select(['nickname', 'pointer_test_order']).find().then((res) => {
  3. // success
  4. }, (err) => {
  5. // err
  6. })

请求结果

  1. {
  2. "status": 200,
  3. "data": {
  4. "meta": {
  5. "next": null,
  6. "offset": 0,
  7. "total_count": 1,
  8. "limit": 20,
  9. "previous": null
  10. },
  11. "objects": [
  12. {
  13. "pointer_test_order": {
  14. "id": "5bbac56fbd66033df7fd0aa2",
  15. "_table": "test_order",
  16. "created_by": 61736923,
  17. "updated_at": 1538966895
  18. },
  19. "nickname": "ifanrx"
  20. }
  21. ]
  22. }
  23. }

微信目前对小程序获取用户信息有两个小时的缓存设定,因此,如果一个用户修改了个人信息如头像、昵称等,需两个小时才能重新授权拿到最新的信息。

更新用户信息

更新用户信息与数据表更新数据项方法基本一致。

支持更新的字段:

  • _userprofile 表所有用户定义字段

  • nickname

  • gender

  • country

  • province

  • city

  • language

  • avata

请求示例

  1. let MyUser = new BaaS.User()
  2. let userID = 36395395
  3. let user = MyUser.getWithoutData(userID)
  4. // age 为自定义字段
  5. user.set('age', 30).update().then(res => {
  6. // success
  7. }, err => {
  8. // err
  9. })

设置账号信息

UserRecord.setAccount({username, email, password})

通过微信、支付宝授权登录用户,可以设置用户名、邮箱、密码,以便下次通过用户名或邮箱登录。

参数说明

名称类型必填说明
usernameStringN用户名
emailStringN邮箱
phoneStringN手机号
passwordStringN密码

示例代码

  1. const MyUser = new BaaS.User()
  2. const userRecord = MyUser.getWithoutData(userID)
  3. userRecord.setAccount({
  4. email: 'foo@gmail.com',
  5. username: 'bar',
  6. phone: '15000000000',
  7. password: 'baz',
  8. }).then(res => {
  9. // success
  10. }).catch(err => {
  11. // err
  12. })

返回示例

  1. {
  2. "status": 200,
  3. "data": {
  4. "email": "foo@gmail.com",
  5. "email_verified": false,
  6. "username": "bar",
  7. "phone": "15000000000",
  8. "phone_verified": false,
  9. }
  10. }

批量修改用户自定义字段

BaaS.UserRecord#update(options)

支持更新的字段:

  • _userprofile 表所有用户定义字段

  • nickname

  • gender

  • country

  • province

  • city

  • language

  • avata

参数说明

options:

参数类型必填默认说明
enableTriggerbooleantrue是否触发触发器
withCountbooleantrue是否返回 total_count

withCount 设为 false,接口返回的数据中不包含 total_count,当数据条目多时,可通过不返回 total_count 提高响应速度。如果需要查询记录的总数,请使用 count 方法。

SDK v2.x withCount 的默认值为 true,SDK v3+ withCount 的默认值为 false

通过设置自定义查询条件 Query,将符合条件的用户自定义字段进行批量更新操作

注意:由于条件查询可能命中非常多的数据,默认情况下,限制为最多更新前 1000 条数据。如需要一次性更新更多数据,请通过维护分页来进行。

其中:

请求示例

  1. async function batchUpdate() {
  2. try {
  3. let User = new BaaS.User()
  4. let query = new BaaS.Query()
  5. // 设置查询条件(比较、字符串包含、组合等)
  6. ...
  7. // limit、offset 可以指定按条件查询命中的数据分页
  8. let userRecords = User.limit(10).offset(0).getWithoutData(query)
  9. // 与更新特定记录一致
  10. userRecords.set(key1, value1)
  11. userRecords.incrementBy(key2, value2)
  12. userRecords.append(key3, value3)
  13. let res = await userRecords.update().then(res => {}, err => {})
  14. console.log(res)
  15. // success
  16. return res
  17. } catch(err) {
  18. //err 为 HError 对象
  19. throw err
  20. }
  21. }
  1. // 知晓云后台设置的触发器将不会被触发
  2. function batchUpdate() {
  3. let User = new BaaS.User()
  4. let query = new BaaS.Query()
  5. // 设置查询条件(比较、字符串包含、组合等)
  6. ...
  7. // limit、offset 可以指定按条件查询命中的数据分页
  8. let userRecords = User.limit(10).offset(0).getWithoutData(query)
  9. // 与更新特定记录一致
  10. userRecords.set(key1, value1)
  11. userRecords.incrementBy(key2, value2)
  12. userRecords.append(key3, value3)
  13. userRecords.update().then(res => {
  14. console.log(res)
  15. callback(null, res)
  16. }, err => {
  17. //err 为 HError 对象
  18. callback(err)
  19. })
  20. }

返回示例

回调中的 res 对象结构如下:

  1. {
  2. "status": 200,
  3. "data": {
  4. "limit": 1,
  5. "next": "/dserve/v2.1/miniapp/user_profile/?where=%7B%7D&enable_trigger=1&limit=1&offset=1",
  6. "offset": 0,
  7. "operation_result": [
  8. {
  9. "success": {
  10. "id": "5a3c51cdceb616ccfc9d5f78",
  11. "updated_at": 1571044054
  12. }
  13. }
  14. ],
  15. "succeed": 1,
  16. "total_count": 402
  17. }
  18. }

批量修改用户自定义字段不触发触发器

不触发触发器的情况下会有以下的行为:

  • 当更新命中总条目 <= 1000 时,无论 limit 设置为多少,均为同步更新,将返回每一条更新的 id 和更新结果,详见下方返回示例中同步执行部分。
  • 当更新命中总条目 > 1000 时,根据设置 limit 的不同,将有下方两种行为:
    • limit <= 1000 时,操作记录为同步执行
    • limit > 1000 或未设置时,则会转为异步执行并移除 limit 限制,变成操作全部
  1. async function batchUpdate() {
  2. try {
  3. let User = new BaaS.User()
  4. let query = new BaaS.Query()
  5. // 设置查询条件(比较、字符串包含、组合等)
  6. ...
  7. // limit、offset 可以指定按条件查询命中的数据分页
  8. let userRecords = User.limit(10).offset(0).getWithoutData(query)
  9. // 与更新特定记录一致
  10. userRecords.set(key1, value1)
  11. userRecords.incrementBy(key2, value2)
  12. userRecords.append(key3, value3)
  13. let res = await userRecords.update({enableTrigger: false}).then(res => {}, err => {})
  14. console.log(res)
  15. // success
  16. return res
  17. } catch(err) {
  18. //err 为 HError 对象
  19. throw err
  20. }
  21. }
  1. // 知晓云后台设置的触发器将不会被触发
  2. function batchUpdate() {
  3. let User = new BaaS.User()
  4. let query = new BaaS.Query()
  5. // 设置查询条件(比较、字符串包含、组合等)
  6. ...
  7. // limit、offset 可以指定按条件查询命中的数据分页
  8. let userRecords = User.limit(10).offset(0).getWithoutData(query)
  9. // 与更新特定记录一致
  10. userRecords.set(key1, value1)
  11. userRecords.incrementBy(key2, value2)
  12. userRecords.append(key3, value3)
  13. userRecords.update({enableTrigger: false}).then(res => {
  14. console.log(res)
  15. callback(null, res)
  16. }, err => {
  17. //err 为 HError 对象
  18. callback(err)
  19. })
  20. }

返回示例

同步操作时,回调中的 res 对象结构如下:

  1. {
  2. "status": 200,
  3. "data": {
  4. "limit": 1,
  5. "next": "/dserve/v2.1/miniapp/user_profile/?where=%7B%7D&enable_trigger=1&limit=1&offset=1",
  6. "offset": 0,
  7. "operation_result": [
  8. {
  9. "success": {
  10. "id": "5a3c51cdceb616ccfc9d5f78",
  11. "updated_at": 1571044054
  12. }
  13. }
  14. ],
  15. "succeed": 1,
  16. "total_count": 402
  17. }
  18. }

异步操作时,回调中的 res 对象结构如下:

  1. {
  2. "status": 200,
  3. "data": {
  4. "statys": "ok",
  5. "operation_id": 1 // 可以用来查询到最终执行的结果
  6. }
  7. }

获取异步执行结果,请查看接口文档

删除用户

MyUser.delete(userID)

参数说明

名称类型必填说明
userIDNumberY用户 ID

示例代码

  1. const MyUser = new BaaS.User()
  2. User.delete(userID).then(res => {
  3. // success
  4. }).catch(err => {
  5. // err
  6. })

返回示例

  1. {
  2. "status": 204,
  3. "data": ""
  4. }

获取符合筛选条件的用户总数

BaaS.User#count()

  1. let MyUser = new BaaS.User()
  2. let query = new BaaS.Query()
  3. query.contains('nickname', 'like')
  4. let num = await MyUser.setQuery(query).count()
  5. console.log(num) // 10
  1. let MyUser = new BaaS.User()
  2. let query = new BaaS.Query()
  3. query.contains('nickname', 'like')
  4. MyUser.setQuery(query).count().then(num => {
  5. // success
  6. console.log(num) // 10
  7. callback(null, res)
  8. }, err => {
  9. // err
  10. callback(err)
  11. })

查询,获取用户列表

BaaS.User#find(options)

参数说明

options:

参数类型必填默认说明
withCountbooleantrue是否返回 total_count

withCount 设为 false,接口返回的数据中不包含 total_count,当数据条目多时,可通过不返回 total_count 提高响应速度。如果需要查询记录的总数,请使用 count 方法。

SDK v2.x withCount 的默认值为 true,SDK v3+ withCount 的默认值为 false

用户查询与数据表查询方法一致

请求示例

  1. let MyUser = new BaaS.User()
  2. // 查找所有用户
  3. MyUser.find()
  4. // 查询 nickname 中包含 like 的用户
  5. let query = new BaaS.Query()
  6. query.contains('nickname', 'like')
  7. MyUser.setQuery(query).find().then(res => {
  8. // success
  9. }, err => {
  10. // err
  11. })

查询用户组下的用户

_group 是一个系统定义的特殊字段,可以通过 _group 来查询指定用户组下的用户,目前只支持 in 查询。该字段仅支持查询,不支持删除和修改。

  1. let MyUser = new BaaS.User()
  2. let query = new BaaS.Query()
  3. // 查询用户组 [123, 456, 789] 下的用户
  4. query.in('_group', [123, 456, 789])
  5. MyUser.setQuery(query).find().then(res => {
  6. // success
  7. }, err => {
  8. // err
  9. })

返回示例

成功时 res 结构如下

  1. {
  2. "status": 200,
  3. "data": {
  4. "meta": {
  5. "limit": 20,
  6. "next": null,
  7. "offset": 0,
  8. "previous": null,
  9. "total_count": 3
  10. },
  11. "objects": [
  12. {
  13. "age": 40,
  14. "avatar": "https://media.ifanrusercontent.com/tavatar/f1/e8/f1e8da860635ec7386102a4a9bb5e45857c9369e.jpg",
  15. "city": "Guangzhou",
  16. "country": "China",
  17. "created_at": 1513326300,
  18. "created_by": 36476036,
  19. "gender": 1,
  20. "id": 36476036,
  21. "is_authorized": true,
  22. "language": "zh_CN",
  23. "nickname": "yuky123123",
  24. "openid": "xxxxxxx",
  25. "province": "Guangdong",
  26. "unionid": null,
  27. "updated_at": 1524146181,
  28. "_group": [123],
  29. "user_id": 36476036
  30. }
  31. ]
  32. }
  33. }

排序

用户查询排序与数据表排序方法一致,不包含在返回数据里的字段不支持排序,如 created_at。

请求示例

  1. let MyUser = new BaaS.User()
  2. MyUser.orderBy('-nickname').find().then()

分页

用户查询分页与数据表分页方法一致。

请求示例

  1. let MyUser = new BaaS.User()
  2. MyUser.limit(5).offset(10).find().then()

pointer 引用

使用 wx.BaaS.User().getWithoutData 可以创建一个 _userprofile 指定数据行的引用。主要配合 pointer 功能使用

  1. let user = new BaaS.User().getWithoutData(123456)

具体使用方法请参考 数据表-添加 pointer 类型数据 小节