>[danger] **棄用提醒:**
> *由于看云對于免費用戶的限制愈發嚴苛,本文檔已經遷移至語雀。本文檔將不做維護。*
> **語雀地址**:[https://www.yuque.com/a632079/nodebb](https://www.yuque.com/a632079/nodebb)
*****
# 常用方法 & 變量
[TOC]
## 導言

NodeBB 自身攜帶了一系列方法, 我們將其稱為 **NodeBB 系統方法庫**。 NodeBB 系統方法庫包含數據庫操作, 權限管理, 用戶操作, 路由管理, socket.io操作等快捷的方法。 出于快速開發的考慮, NodeBB 團隊允許開發者們調用系統方法庫書寫插件。作為開發的第一步, 初步了解 NodeBB 系統函數庫的使用方法十分必要。
方法庫位置: https://github.com/NodeBB/NodeBB/tree/master/src
>[info] 在 v1.13.0 中, NodeBB 已經完成方法庫的 Promise 支持,所以我們不必對其異步處理了。
## 常用方法
在本節中, 我們會初步介紹 NodeBB 方法庫的基本使用方法, 以及常用的方法。
### 申明函數庫
```
// 系統方法庫
const user = require.main.require('./src/user')
const db = require.main.require('./src/database')
const meta = require.main.require('./src/meta')
const utils = require.main.require('./src/public/src/utils')
// 常用模塊
const async = require.main.require('async')
const nconf = require.main.require('nconf')
const winston = require.main.require('winston')
const path = require.main.require('path')
```
>[info] 以上是相對常用的 NodeBB 方法庫 以及 NodeBB 依賴模塊 的申明
一次申明所有常用的方法庫是一個十分有助于提高開發效率的手段, 可以避免在開發過程中多次回到文件頭添加申明。
### 用戶表操作
本節將介紹 NodeBB 方法庫中 `user` 的常見使用方法。
>[danger] 注意: 如果需要讀寫自定義的用戶表字段, 需要添加白名單。
#### 添加白名單
在 `plugin.json` 中添加 hook :
```json
{
"hooks": [
{
"hook": "filter:user.whitelistFields",
"method": "addUserWhitelistFields"
}
]
}
```
在 `core.js` 中添加:
```javascript
class Core {
// 在類中添加
async addUserWhitelistFields: (data) => {
data.whitelist.push('field_name') // 添加白名單字段名
return data
}
}
```
#### 保存數據至用戶表
* 方法: `user.setUserField`, `user.setUserFields`
* 參數:
* 前者: `uid`, `field`, `data`
* 后者: `uid`, `data` (對象)
##### 使用例子
```javascript
async () => {
// 如果只是保存一些非重要信息(無需確保寫安全), 可以移除下方的 `await` 來提高速度
await user.setUserField(1, 'access_token', '**********')
await user.setUserFields(1, {
access_token: '******',
access_secret: '******'
})
}
```
#### 獲取用戶表數據
* 方法: `user.getUsersFields` , `user.getUserFields` , `user.getUserField`
* 參數: `uids`, `fields`
> **注:** 后兩者其實是前者的語法糖。
該方法能夠便捷得獲取某用戶的特有信息。
##### 使用例子
```javascript
async () => {
const username = await user.getUserField(1, 'username') // 返回 uid 為 1 的用戶名, 返回類型就是數據類型
const data = await user.getUserFields(1, ['username', 'email']) // 返回 uid 為 1 的用戶的用戶名和郵箱, 返回類型是數組
const muti = await user.getUsersFields([1, 2], ['username', 'email']) // 返回 uid 1, 2 的用戶名和郵箱, 返回類型是數組 (多元數組)
}
```
#### 獲取 UID
NodeBB 中可以通過 Username, Userslug, Email 來獲取 UID.
方法: `user.getUidByEmail ` `user.getUidByUsersulg` `user.getUidByUsername`
參數: `input`
> **注:** NodeBB 還提供類似獲取用戶表數據中的獲取多數的方法,也提供了獲取 username , userslug, email 的方法, 有需要可以查看 NodeBB 系統方法庫。
##### 使用例子
```javascript
async () => {
const uid = await user.getUidByEmail('admin@admin.com') // 返回 uid 或者 null
const also_uid = await user.getUidByUsername('a632079') // 返回 uid 或者 null
const uid_too = await user.getUidByUserslug('a632079') // 返回 uid 或者 null
}
````
#### 創建用戶
方法: `user.create`
參數: `data`(對象)
> **注:** data 中 email, username 必須存在. password 可以缺省
##### 使用例子
```js
async () => {
await user.create({
username: 'username',
email: 'user@mail.com',
password: 'input_Password' // 密碼可以缺省, 通常只在通過 SSO 注冊的時候缺省
})
}
```
### 數據庫操作
本節將會介紹 NodeBB 方法庫中 `db` 的常用方法。
#### 保存數據
方法: `db.setObjectField`
參數: `key`, `field`, `data`
##### 使用例子
```js
async () => {
// 無需確保寫安全, 可以移除 await 提高速度
await db.setObjectField('wxid:uid', 'wechat_openid', 'uid') // SSO WeChat 中的例子, 通過 wechat openid 獲得 用戶 uid 以便實現登錄
}
```
#### 判斷數據是否存在
方法: `db.isObjectField`
參數: `key` `field`
##### 使用例子
```js
async () => {
const juage = await db.isObjectField('qqid:uid', 'qq_openid') // 返回布爾值. true 或者 false
}
```
#### 獲取數據
方法: `db.getObjectField`
參數: `key`, `field`
##### 使用例子
```js
async () => {
const juage = await db.getObjectField('qqid:uid', 'qq_openid') // 返回 null 或者 數據
}
```
### 元信息操作
本節將講述 NodeBB 系統庫 `meta` 中最常用的方法
#### 獲取設置
* 方法: `meta.setting.get`, `meta.setting.getOne`
* 參數:
* 前者: `hash`
* 后者: `hash`, `field`
##### 使用例子
```js
async () => {
const settings = await meta.setting.get('aliverify') // 摘自 AliVerify,返回 null 或者設置
const appkey = await meta.setting.getOne('aliverify', 'appkey') // 摘自 AliVerify,返回 null 或者設置
}
```
#### 保存設置
* 方法: `meta.setting.set`,`meta.setting.setOne`
* 參數:
* 前者: `hash`, `values`
* 后者: `hash`, `field`, `value`
>[info] 我們并不推薦使用此方法, 設置更應該交給插件后臺設置控制。
##### 使用例子
```js
async () => {
await meta.setting.set('qq_config', {
appId: '******',
appToken: '*******'
})
await meta.setting.setOne('qq_config', 'appId', '******')
}
```
### 工具類
本節中, 我們將介紹 NodeBB 公共庫中 `/public/src/utils` 的用法
#### 生產 UUID
方法: `utils.generateUUID`
##### 使用例子
```js
async () => {
const uuid = utils.generateUUID()
}
```
#### 鹽化
可以將 username 轉換成 userslug
方法: `utils.slugify`
參數: `username`
##### 使用例子
```
async () => {
const userslug = utils.slugify('MyUserName')
}
```
#### 有效性檢查
方法: `utils.isEmailValid`, `utils.isUserNameValid`, `utils.isPasswordValid`, `utils.isNumber`
參數: `input`
##### 使用例子
```
async () => {
utils.isEmailValid('mail.com') // 返回 false
utils.isUserNameValid('a632079') // 返回 true
utils.isPasswordValid('') // 返回 false
utils.isNumber('123') // 返回 false
}
```
## 常用變量
### Session 中的 uid
如果有 express 的 `req` 參數傳入, 我們就可以很方便得獲取 uid
#### 使用例子
```js
async (req) => {
if (req.user && req.user.uid && req.user.uid > 0) {
const uid = req.user.uid
}
}
```
>[info] 編寫: a632079
維護: PA Team
審核: PA Team
最后更新: 2019.12.09
- 序
- 贊助
- 導言
- 安裝
- 通過操作系統
- Windows + Mongodb/Redis
- Ubuntu/Debian + Redis/Mongodb
- CentOS + Redis
- CentOS + Mongodb
- FreeBSD/OpenBSD + Redis
- Arch Linux + Redis
- OSX + Redis
- 通過云服務
- 通過主機面板安裝
- AppNode
- CPanel
- 寶塔
- 使用
- FAQ
- 高級
- 運行 NodeBB
- 配置 Config.json
- 配置 Nginx
- 配置 MongoDB
- 更新 NodeBB
- 設置 Widgets
- 安裝 Yarn
- 更新 MongoDB
- 數據庫備份與恢復
- 重置管理員密碼
- 讓 NodeBB 支持搜索
- 優化
- 優化配置,提升NodeBB處理能力
- Google字體庫 -> 360公共前端庫
- Google字體庫 -> 中科大鏡像
- 海外VPS提升NodeBB訪問速度
- 通過 NodeBB API 自動發帖
- 開發
- 準備
- 常用方法 & 變量
- 插件制作
- 使用工具包編寫一個插件
- 主題制作
- 使用工具包編寫一個主題
- 部件制作
- 國際化
- 鉤子(hook)使用說明