chore(i18n,curriculum): processed translations (#42478)

This commit is contained in:
camperbot
2021-06-14 23:47:03 +09:00
committed by GitHub
parent e89de73f66
commit 7a0d7e603b
34 changed files with 54 additions and 54 deletions

View File

@ -9,7 +9,7 @@ dashedName: comparison-with-the-inequality-operator
# --description--
不相等運算符(`!=`)與相等運算符是相反的。 這意味着嚴格不相等並返回 `false` 的地方,用嚴格相等運算符會返回 `true`*反之亦然*。 與相等運算符類似,不相等運算符在比較的時候也會轉換值的數據類型。
不相等運算符(`!=`)與相等運算符是相反的。 這意味着不相等並返回 `false` 的地方,用相等運算符會返回 `true`*反之亦然*。 與相等運算符類似,不相等運算符在比較的時候也會轉換值的數據類型。
**例如**

View File

@ -26,7 +26,7 @@ dashedName: comparison-with-the-strict-equality-operator
# --instructions--
`if` 語句中,添加相等運算符,這樣函數在當 `val` 嚴格等於 `7` 的時候,會返回 `Equal`
`if` 語句中,添加嚴格相等運算符,這樣函數在當 `val` 嚴格等於 `7` 的時候,會返回 `Equal`
# --hints--

View File

@ -9,7 +9,7 @@ dashedName: comparisons-with-the-logical-and-operator
# --description--
有時你需要在一次判斷中做多個操作。 當且僅當<dfn>運算符</dfn>的左邊和右邊都是 true<dfn>邏輯與</dfn>運算符(`&&`)纔會返回`true`
有時你需要在一次判斷中做多個操作。 當且僅當<dfn>運算符</dfn>的左邊和右邊都是 true<dfn>邏輯與</dfn>運算符(`&&`)纔會返回 `true`
同樣的效果可以通過 if 語句的嵌套來實現:
@ -33,7 +33,7 @@ return "No";
# --instructions--
請使用 `&&` 運算符把兩個 if 語句合併爲一個 if 語句,如果 `val` 小於或等於`50` 並且大於或等於 `25` 時,返回 `Yes`。 否則,將返回`No`
請使用 `&&` 運算符把兩個 if 語句合併爲一個 if 語句,如果 `val` 小於或等於 `50` 並且大於或等於 `25` 時,返回 `Yes`。 否則,將返回 `No`
# --hints--

View File

@ -24,7 +24,7 @@ ourStr += "I come second.";
# --instructions--
使用 `+=` 操作符,多行合併字符串 `This is the first sentence.``This is the second sentence.` ,並賦值給 `myStr` 。 像編輯器裏顯示的那樣使用 `+=` 操作符。 先把第一個字符串賦值給 `myStr`,然後拼接第二個字符串。
使用 `+=` 操作符,多行合併字符串 `This is the first sentence.``This is the second sentence.` ,並賦值給 `myStr` 。 像示例那樣使用 `+=` 操作符。 先把第一個字符串賦值給 `myStr`,然後拼接第二個字符串。
# --hints--

View File

@ -9,7 +9,7 @@ dashedName: global-vs--local-scope-in-functions
# --description--
一個程序中有可能具有相同名稱的<dfn>局部</dfn>變量 和<dfn>全局</dfn>變量。 在這種情況下,`local` 變量將會優先於`global`變量。
一個程序中有可能具有相同名稱的<dfn>局部</dfn>變量 和<dfn>全局</dfn>變量。 在這種情況下,局部變量將會優先於全局變量。
下面爲例:
@ -21,7 +21,7 @@ function myFun() {
}
```
函數 `myFun` 將會返回 `Head`,因爲 `local` 變量優先級更高。
函數 `myFun` 將會返回字符串 `Head`,因爲局部變量優先級更高。
# --instructions--

View File

@ -19,23 +19,23 @@ var sandwich = ["peanut butter", "jelly", "bread"]
# --instructions--
創建一個包含字符串`string`)和數字( `number`(按照字符串數字的順序)的數組 `myArray`
創建一個包含字符串和數字(按照字符串數字的順序)的數組 `myArray`
# --hints--
`myArray`該是一個數組(`array`
`myArray`爲數組
```js
assert(typeof myArray == 'object');
```
`myArray` 數組的第一個元素應該是一個字符串`string`
`myArray` 數組的第一個元素應該是一個字符串。
```js
assert(typeof myArray[0] !== 'undefined' && typeof myArray[0] == 'string');
```
`myArray` 數組的第二個元素應該是一個數字`number`
`myArray` 數組的第二個元素應該是一個數字。
```js
assert(typeof myArray[1] !== 'undefined' && typeof myArray[1] == 'number');

View File

@ -11,7 +11,7 @@ dashedName: understanding-boolean-values
另一種數據類型是布爾(<dfn>Boolean</dfn>)。 布爾值只能是兩個值中的一個:`true` 或者 `false`。 它非常像電路開關,`true` 是 “開”,`false` 是 “關”。 這兩種狀態是互斥的。
**注意:**布爾值是不帶引號的。 字符串 `"true"``"false"` 不是布爾值,在 JavaScript 中也沒有特殊含義。
**注意:** 布爾值是不帶引號的。 字符串 `"true"``"false"` 不是布爾值,在 JavaScript 中也沒有特殊含義。
# --instructions--

View File

@ -11,16 +11,16 @@ dashedName: use-bracket-notation-to-find-the-last-character-in-a-string
要獲取字符串的最後一個字符,可以用字符串的長度減 1 的索引值。
例如, `var firstName = "Charles"` 中,可以用 `firstName[firstName.length - 1]` 來得到字符串的最後的一個字符。
例如,如果 `var firstName = "Ada"` 中,那麼你可以通過 `firstName[firstName.length - 1]` 來得到字符串的最後的一個字符。
示例:
```js
var firstName = "Charles";
var firstName = "Ada";
var lastLetter = firstName[firstName.length - 1];
```
`lastLetter` 值爲字符串 `s`
`lastLetter` 值爲字符串 `a`
# --instructions--

View File

@ -11,16 +11,16 @@ dashedName: use-bracket-notation-to-find-the-nth-to-last-character-in-a-string
我們既可以獲取字符串的最後一個字符,也可以用獲取字符串的倒數第 N 個字符。
例如,你可以這樣 `firstName[firstName.length - 3]` 來獲得 `var firstName = "Charles"` 字符串中的倒數第三個字符。
例如,你可以通過 `firstName[firstName.length - 3]` 來獲得 `var firstName = "Augusta"` 字符串中的倒數第三個字符。
例如:
```js
var firstName = "Charles";
var firstName = "Augusta";
var thirdToLastLetter = firstName[firstName.length - 3];
```
`thirdToLastLetter` 的值應該爲字符串 `l`
`thirdToLastLetter` 的值應該爲字符串 `s`
# --instructions--

View File

@ -14,7 +14,7 @@ dashedName: add-inline-styles-in-react
# --instructions--
如果你有大量樣式,你可以將樣式 `object`(對象)分配給一個常量,以保持代碼的組織有序。 定義一個 `styles` 常量,並將其聲明爲具有三個樣式屬性及對應值的 `object`(對象)。 使 `div` 的文字顏色爲 `purple`、字號爲 `40`、邊框爲 `2px solid purple`。 然後設置 `style` 屬性,使其等於 `styles` 常量。
如果你有大量樣式,你可以將樣式 `object`(對象)分配給一個常量,以保持代碼的組織有序。 在文件頂部將你的樣式聲明爲全局變量。 定義一個 `styles` 常量,並將其聲明爲具有三個樣式屬性及對應值的 `object`(對象)。 使 `div` 的文字顏色爲 `purple`、字號爲 `40`、邊框爲 `2px solid purple`。 然後設置 `style` 屬性,使其等於 `styles` 常量。
# --hints--

View File

@ -10,7 +10,7 @@ dashedName: authentication-strategies
策略是認證用戶的一種方式。 如果你讓用戶在註冊時填寫了用戶信息,那你就可以基於這些信息進行驗證。或者也可以引入第三方登錄,如 Google 或者 Github。 對於這個項目的驗證策略,我們會採用自己搭建的方式完成。 可以[點擊這裏](http://passportjs.org/)訪問 Passport 網站,查看數以百計的策略。
引入 `passport-local` 作爲依賴,然後將它添加到服務器,就像這樣:`const LocalStrategy = require('passport-local');`
引入 `passport-local@~1.0.0` 作爲依賴,然後將它添加到服務器,就像這樣:`const LocalStrategy = require('passport-local');`
然後,需要讓 passport **使用**一個實例化的 LocalStrategy 對象,這個對象的一些設置已完成。 請注意,接下來的所有代碼都應寫在連接數據庫的回調中,因爲它們的執行都依賴數據庫。

View File

@ -10,7 +10,7 @@ dashedName: authentication-with-socket-io
目前,你還無法確定連接到服務器的用戶身份。 雖然 `req.user` 包含用戶信息,但這個只在用戶直接與服務器交互時產生。當用戶通過 web socket 與服務器連接時,由於不存在 `req` 對象,我們就無法獲取用戶數據。 解決這個問題的方法之一是通過讀取和解析請求中包含 passport session 的 cookie然後反序列化進而獲取用戶信息對象。 幸運的是NPM 上有可以讓這個複雜的流程簡單化的庫。
添加 `passport.socketio``connect-mongo@~3.2.0``cookie-parser` 作爲依賴,把它們分別賦值給 `passportSocketIo``MongoStore``cookieParser`。 同時,我們需要從之前引入的 `express-session` 中開闢新的內存空間, 就像這樣:
添加 `passport.socketio@~3.7.0``connect-mongo@~3.2.0``cookie-parser@~1.4.5` 作爲依賴,把它們分別賦值給 `passportSocketIo``MongoStore``cookieParser`。 同時,我們需要從之前引入的 `express-session` 中開闢新的內存空間, 就像這樣:
```js
const MongoStore = require('connect-mongo')(session);

View File

@ -10,7 +10,7 @@ dashedName: hashing-your-passwords
回過頭來看信息安全,你也許記得在數據庫中存儲明文密碼是*絕對*禁止的。 現在,我們需要引入 BCrypt 來解決這個問題。
添加 BCrypt 作爲依賴,並在服務端請求它。 你需要在兩個步驟中使用哈希運算:註冊和保存新賬戶,以及登錄時檢查密碼是否正確。
添加 `bcrypt@~5.0.0` 作爲依賴,並在服務端使用它。 你需要在兩個步驟中使用哈希運算:註冊和保存新賬戶,以及登錄時檢查密碼是否正確。
目前處理註冊的路由中,我們是這樣把密碼添加到數據庫的:`password: req.body.password`。 保存哈希值的一個簡單方式是在數據庫邏輯中添加 `const hash = bcrypt.hashSync(req.body.password, 12);`,然後把 `req.body.password` 替換爲 `password: hash`

View File

@ -8,7 +8,7 @@ dashedName: implementation-of-social-authentication-ii
# --description--
設置 GitHub 驗證的最後一步是創建策略本身。 爲此,你需要在項目中添加 passport-github 依賴,並在 `auth.js` 請求它,作爲 `GithubStrategy`,像這樣:`const GitHubStrategy = require('passport-github').Strategy;`。 別忘了請求和配置 `dotenv`,使用你的環境變量。
設置 GitHub 驗證的最後一步是創建策略本身。 爲此,你需要在項目中添加 `passport-github@~1.1.0` 依賴,並在 `auth.js` 中請求它,作爲 `GithubStrategy`,像這樣:`const GitHubStrategy = require('passport-github').Strategy;`。 別忘了請求和配置 `dotenv`,使用你的環境變量。
爲了設置 GitHub 策略,我們需要在 Passport 中使用實例化的 `GitHubStrategy`,它可以接收兩個參數:一個對象(包括 `clientID``clientSecret``callbackURL`),以及一個回調函數。在這個回調函數中,我們要處理驗證成功時,判斷用戶是否已經在數據庫中存在的邏輯,以及在用戶數據庫對象中最初保存哪些字段。 這種處理方式適用於絕大部分第三方驗證策略,但有些策略會需要我們提供更多的信息,詳情請參考相關策略的 GitHub README。 例如Google 的驗證策略會要求你提供一個 *scope*,用於標示用戶成功登錄後,你需要從返回的對象中獲取那些信息。以及,這也需要經過用戶同意,你纔可以獲取到。 你可以在[這裏](https://github.com/jaredhanson/passport-github/)瞭解當前我們使用的驗證策略的用法,不過我們也會在 freeCodeCamp 課程中進行詳細講解。

View File

@ -12,7 +12,7 @@ dashedName: serialization-of-a-user-object
我們需要用到序列化和反序列化的方法來進行配置。 passport 爲我們提供了 `passport.serializeUser( OURFUNCTION )``passport.deserializeUser( OURFUNCTION )` 兩個方法。
`serializeUser` 方法接收兩個參數,分別是表示用戶的對象和一個回調函數。 其中,回調函數的返回值應爲這個用戶的唯一標識符:最簡單的寫法就是讓它返回用戶的 `_id`這個屬性是 MongoDB 爲用戶創建的唯一字段。 類似地,`deserializeUser` 也接收兩個參數,分別是在序列化時生成的標識符以及一個回調函數。在回調函數裏,我們需要根據根據傳入的標識符(比如 \_id返回表示用戶的對象。 爲了在 MongoDB 中通過 query查詢語句獲取 `_id` 字段,首先我們需要創建 `const ObjectID = require('mongodb').ObjectID;`;然後調用它:`new ObjectID(THE_ID)`當然,這一切的前提都是先引入 MongoDB 作爲依賴。 你可以在下面的例子中看到:
`serializeUser` 方法接收兩個參數,分別是表示用戶的對象和一個回調函數。 其中,回調函數的返回值應爲這個用戶的唯一標識符:最簡單的寫法就是讓它返回用戶的 `_id`它應當是唯一的,是由 MongoDB 產生的。 類似地,`deserializeUser` 也接收兩個參數,分別是在序列化時生成的標識符以及一個回調函數。在回調函數裏,我們需要根據根據傳入的標識符(比如 \_id返回表示用戶的對象。 爲了在 MongoDB 中通過 query查詢語句獲取 `_id` 字段,首先我們需要創建 `const ObjectID = require('mongodb').ObjectID;`;然後調用它:`new ObjectID(THE_ID)`確保添加 `mongodb@~3.6.0` 作爲依賴。 你可以在下面的例子中看到:
```js
passport.serializeUser((user, done) => {

View File

@ -10,9 +10,9 @@ dashedName: set-up-passport
現在我們來創建 *Passport*,最終我們需要用它來實現用戶註冊和登錄。 除了 Passport我們還會用 Express-session 來處理 session會話。 在客戶端,我們可以用這個中間件把 session id 儲存到 cookie。同時我們可以在服務器上通過這個 id 訪問 session 數據。 通過這種方式,我們無需把用戶的個人賬號信息存到 cookie來完成用戶的驗證。只需要用這個 id 作爲 *key* 來訪問服務器上用戶的數據即可。
爲了在你的項目中使用 Passport首先你需要在 package.json 文件中添加依賴: `"passport": "^0.3.2"`
爲了在你的項目中使用 Passport首先你需要在 package.json 文件中添加依賴: `passport@~0.4.1`
此外,還需要添加 Express-session 作爲依賴。 Express-session 有許多高級特性,但我們暫時只需要瞭解其基礎功能。 `"express-session": "^1.15.0"`
此外,還需要添加 Express-session 作爲依賴。 Express-session 有許多高級特性,但我們暫時只需要瞭解其基礎功能。 `express-session@~1.17.1`
現在,我們需要配置 session 並初始化 Passport。 請先創建變量 “session” 和 “passport” 來分別引入 “express-session” 和 “passport”。

View File

@ -10,7 +10,7 @@ dashedName: set-up-the-environment
在接下來的挑戰中,我們將會用到 `chat.pug` 文件。 首先,在你的 `routes.js` 文件中爲 `/chat` 添加一個處理 GET 請求的路由,並給它傳入 `ensureAuthenticated`。在回調函數中,我們需要讓它渲染 `chat.pug` 文件,並在響應中包含 `{ user: req.user }` 信息。 現在,請修改 `/auth/github/callback` 路由,讓它可以像這樣設置 user_id`req.session.user_id = req.user.id`,並在設置完成後重定向至 `/chat`
我們還需要添加 `http` `socket.io` 兩個依賴項,並且像這樣引入
添加 `socket.io@~2.3.0` 作爲依賴項,並且在你的服務器中和 `http` (內置在 Nodejs 中)一起導入/實例化。具體如下
```javascript
const http = require('http').createServer(app);

View File

@ -9,7 +9,7 @@ dashedName: comparison-with-the-inequality-operator
# --description--
不相等运算符(`!=`)与相等运算符是相反的。 这意味着严格不相等并返回 `false` 的地方,用严格相等运算符会返回 `true`*反之亦然*。 与相等运算符类似,不相等运算符在比较的时候也会转换值的数据类型。
不相等运算符(`!=`)与相等运算符是相反的。 这意味着不相等并返回 `false` 的地方,用相等运算符会返回 `true`*反之亦然*。 与相等运算符类似,不相等运算符在比较的时候也会转换值的数据类型。
**例如**

View File

@ -26,7 +26,7 @@ dashedName: comparison-with-the-strict-equality-operator
# --instructions--
`if` 语句中,添加相等运算符,这样函数在当 `val` 严格等于 `7` 的时候,会返回 `Equal`
`if` 语句中,添加严格相等运算符,这样函数在当 `val` 严格等于 `7` 的时候,会返回 `Equal`
# --hints--

View File

@ -9,7 +9,7 @@ dashedName: comparisons-with-the-logical-and-operator
# --description--
有时你需要在一次判断中做多个操作。 当且仅当<dfn>运算符</dfn>的左边和右边都是 true<dfn>逻辑与</dfn>运算符(`&&`)才会返回`true`
有时你需要在一次判断中做多个操作。 当且仅当<dfn>运算符</dfn>的左边和右边都是 true<dfn>逻辑与</dfn>运算符(`&&`)才会返回 `true`
同样的效果可以通过 if 语句的嵌套来实现:
@ -33,7 +33,7 @@ return "No";
# --instructions--
请使用 `&&` 运算符把两个 if 语句合并为一个 if 语句,如果 `val` 小于或等于`50` 并且大于或等于 `25` 时,返回 `Yes`。 否则,将返回`No`
请使用 `&&` 运算符把两个 if 语句合并为一个 if 语句,如果 `val` 小于或等于 `50` 并且大于或等于 `25` 时,返回 `Yes`。 否则,将返回 `No`
# --hints--

View File

@ -24,7 +24,7 @@ ourStr += "I come second.";
# --instructions--
使用 `+=` 操作符,多行合并字符串 `This is the first sentence.``This is the second sentence.` ,并赋值给 `myStr` 。 像编辑器里显示的那样使用 `+=` 操作符。 先把第一个字符串赋值给 `myStr`,然后拼接第二个字符串。
使用 `+=` 操作符,多行合并字符串 `This is the first sentence.``This is the second sentence.` ,并赋值给 `myStr` 。 像示例那样使用 `+=` 操作符。 先把第一个字符串赋值给 `myStr`,然后拼接第二个字符串。
# --hints--

View File

@ -9,7 +9,7 @@ dashedName: global-vs--local-scope-in-functions
# --description--
一个程序中有可能具有相同名称的<dfn>局部</dfn>变量 和<dfn>全局</dfn>变量。 在这种情况下,`local` 变量将会优先于`global`变量。
一个程序中有可能具有相同名称的<dfn>局部</dfn>变量 和<dfn>全局</dfn>变量。 在这种情况下,局部变量将会优先于全局变量。
下面为例:
@ -21,7 +21,7 @@ function myFun() {
}
```
函数 `myFun` 将会返回 `Head`,因为 `local` 变量优先级更高。
函数 `myFun` 将会返回字符串 `Head`,因为局部变量优先级更高。
# --instructions--

View File

@ -19,23 +19,23 @@ var sandwich = ["peanut butter", "jelly", "bread"]
# --instructions--
创建一个包含字符串`string`)和数字( `number`(按照字符串数字的顺序)的数组 `myArray`
创建一个包含字符串和数字(按照字符串数字的顺序)的数组 `myArray`
# --hints--
`myArray`该是一个数组(`array`
`myArray`为数组
```js
assert(typeof myArray == 'object');
```
`myArray` 数组的第一个元素应该是一个字符串`string`
`myArray` 数组的第一个元素应该是一个字符串。
```js
assert(typeof myArray[0] !== 'undefined' && typeof myArray[0] == 'string');
```
`myArray` 数组的第二个元素应该是一个数字`number`
`myArray` 数组的第二个元素应该是一个数字。
```js
assert(typeof myArray[1] !== 'undefined' && typeof myArray[1] == 'number');

View File

@ -11,7 +11,7 @@ dashedName: understanding-boolean-values
另一种数据类型是布尔(<dfn>Boolean</dfn>)。 布尔值只能是两个值中的一个:`true` 或者 `false`。 它非常像电路开关,`true` 是 “开”,`false` 是 “关”。 这两种状态是互斥的。
**注意:**布尔值是不带引号的。 字符串 `"true"``"false"` 不是布尔值,在 JavaScript 中也没有特殊含义。
**注意:** 布尔值是不带引号的。 字符串 `"true"``"false"` 不是布尔值,在 JavaScript 中也没有特殊含义。
# --instructions--

View File

@ -11,16 +11,16 @@ dashedName: use-bracket-notation-to-find-the-last-character-in-a-string
要获取字符串的最后一个字符,可以用字符串的长度减 1 的索引值。
例如, `var firstName = "Charles"` 中,可以用 `firstName[firstName.length - 1]` 来得到字符串的最后的一个字符。
例如,如果 `var firstName = "Ada"` 中,那么你可以通过 `firstName[firstName.length - 1]` 来得到字符串的最后的一个字符。
示例:
```js
var firstName = "Charles";
var firstName = "Ada";
var lastLetter = firstName[firstName.length - 1];
```
`lastLetter` 值为字符串 `s`
`lastLetter` 值为字符串 `a`
# --instructions--

View File

@ -11,16 +11,16 @@ dashedName: use-bracket-notation-to-find-the-nth-to-last-character-in-a-string
我们既可以获取字符串的最后一个字符,也可以用获取字符串的倒数第 N 个字符。
例如,你可以这样 `firstName[firstName.length - 3]` 来获得 `var firstName = "Charles"` 字符串中的倒数第三个字符。
例如,你可以通过 `firstName[firstName.length - 3]` 来获得 `var firstName = "Augusta"` 字符串中的倒数第三个字符。
例如:
```js
var firstName = "Charles";
var firstName = "Augusta";
var thirdToLastLetter = firstName[firstName.length - 3];
```
`thirdToLastLetter` 的值应该为字符串 `l`
`thirdToLastLetter` 的值应该为字符串 `s`
# --instructions--

View File

@ -14,7 +14,7 @@ dashedName: add-inline-styles-in-react
# --instructions--
如果你有大量样式,你可以将样式 `object`(对象)分配给一个常量,以保持代码的组织有序。 定义一个 `styles` 常量,并将其声明为具有三个样式属性及对应值的 `object`(对象)。 使 `div` 的文字颜色为 `purple`、字号为 `40`、边框为 `2px solid purple`。 然后设置 `style` 属性,使其等于 `styles` 常量。
如果你有大量样式,你可以将样式 `object`(对象)分配给一个常量,以保持代码的组织有序。 在文件顶部将你的样式声明为全局变量。 定义一个 `styles` 常量,并将其声明为具有三个样式属性及对应值的 `object`(对象)。 使 `div` 的文字颜色为 `purple`、字号为 `40`、边框为 `2px solid purple`。 然后设置 `style` 属性,使其等于 `styles` 常量。
# --hints--

View File

@ -10,7 +10,7 @@ dashedName: authentication-strategies
策略是认证用户的一种方式。 如果你让用户在注册时填写了用户信息,那你就可以基于这些信息进行验证。或者也可以引入第三方登录,如 Google 或者 Github。 对于这个项目的验证策略,我们会采用自己搭建的方式完成。 可以[点击这里](http://passportjs.org/)访问 Passport 网站,查看数以百计的策略。
引入 `passport-local` 作为依赖,然后将它添加到服务器,就像这样:`const LocalStrategy = require('passport-local');`
引入 `passport-local@~1.0.0` 作为依赖,然后将它添加到服务器,就像这样:`const LocalStrategy = require('passport-local');`
然后,需要让 passport **使用**一个实例化的 LocalStrategy 对象,这个对象的一些设置已完成。 请注意,接下来的所有代码都应写在连接数据库的回调中,因为它们的执行都依赖数据库。

View File

@ -10,7 +10,7 @@ dashedName: authentication-with-socket-io
目前,你还无法确定连接到服务器的用户身份。 虽然 `req.user` 包含用户信息,但这个只在用户直接与服务器交互时产生。当用户通过 web socket 与服务器连接时,由于不存在 `req` 对象,我们就无法获取用户数据。 解决这个问题的方法之一是通过读取和解析请求中包含 passport session 的 cookie然后反序列化进而获取用户信息对象。 幸运的是NPM 上有可以让这个复杂的流程简单化的库。
添加 `passport.socketio``connect-mongo@~3.2.0``cookie-parser` 作为依赖,把它们分别赋值给 `passportSocketIo``MongoStore``cookieParser`。 同时,我们需要从之前引入的 `express-session` 中开辟新的内存空间, 就像这样:
添加 `passport.socketio@~3.7.0``connect-mongo@~3.2.0``cookie-parser@~1.4.5` 作为依赖,把它们分别赋值给 `passportSocketIo``MongoStore``cookieParser`。 同时,我们需要从之前引入的 `express-session` 中开辟新的内存空间, 就像这样:
```js
const MongoStore = require('connect-mongo')(session);

View File

@ -10,7 +10,7 @@ dashedName: hashing-your-passwords
回过头来看信息安全,你也许记得在数据库中存储明文密码是*绝对*禁止的。 现在,我们需要引入 BCrypt 来解决这个问题。
添加 BCrypt 作为依赖,并在服务端请求它。 你需要在两个步骤中使用哈希运算:注册和保存新账户,以及登录时检查密码是否正确。
添加 `bcrypt@~5.0.0` 作为依赖,并在服务端使用它。 你需要在两个步骤中使用哈希运算:注册和保存新账户,以及登录时检查密码是否正确。
目前处理注册的路由中,我们是这样把密码添加到数据库的:`password: req.body.password`。 保存哈希值的一个简单方式是在数据库逻辑中添加 `const hash = bcrypt.hashSync(req.body.password, 12);`,然后把 `req.body.password` 替换为 `password: hash`

View File

@ -8,7 +8,7 @@ dashedName: implementation-of-social-authentication-ii
# --description--
设置 GitHub 验证的最后一步是创建策略本身。 为此,你需要在项目中添加 passport-github 依赖,并在 `auth.js` 请求它,作为 `GithubStrategy`,像这样:`const GitHubStrategy = require('passport-github').Strategy;`。 别忘了请求和配置 `dotenv`,使用你的环境变量。
设置 GitHub 验证的最后一步是创建策略本身。 为此,你需要在项目中添加 `passport-github@~1.1.0` 依赖,并在 `auth.js` 中请求它,作为 `GithubStrategy`,像这样:`const GitHubStrategy = require('passport-github').Strategy;`。 别忘了请求和配置 `dotenv`,使用你的环境变量。
为了设置 GitHub 策略,我们需要在 Passport 中使用实例化的 `GitHubStrategy`,它可以接收两个参数:一个对象(包括 `clientID``clientSecret``callbackURL`),以及一个回调函数。在这个回调函数中,我们要处理验证成功时,判断用户是否已经在数据库中存在的逻辑,以及在用户数据库对象中最初保存哪些字段。 这种处理方式适用于绝大部分第三方验证策略,但有些策略会需要我们提供更多的信息,详情请参考相关策略的 GitHub README。 例如Google 的验证策略会要求你提供一个 *scope*,用于标示用户成功登录后,你需要从返回的对象中获取那些信息。以及,这也需要经过用户同意,你才可以获取到。 你可以在[这里](https://github.com/jaredhanson/passport-github/)了解当前我们使用的验证策略的用法,不过我们也会在 freeCodeCamp 课程中进行详细讲解。

View File

@ -12,7 +12,7 @@ dashedName: serialization-of-a-user-object
我们需要用到序列化和反序列化的方法来进行配置。 passport 为我们提供了 `passport.serializeUser( OURFUNCTION )``passport.deserializeUser( OURFUNCTION )` 两个方法。
`serializeUser` 方法接收两个参数,分别是表示用户的对象和一个回调函数。 其中,回调函数的返回值应为这个用户的唯一标识符:最简单的写法就是让它返回用户的 `_id`这个属性是 MongoDB 为用户创建的唯一字段。 类似地,`deserializeUser` 也接收两个参数,分别是在序列化时生成的标识符以及一个回调函数。在回调函数里,我们需要根据根据传入的标识符(比如 \_id返回表示用户的对象。 为了在 MongoDB 中通过 query查询语句获取 `_id` 字段,首先我们需要创建 `const ObjectID = require('mongodb').ObjectID;`;然后调用它:`new ObjectID(THE_ID)`当然,这一切的前提都是先引入 MongoDB 作为依赖。 你可以在下面的例子中看到:
`serializeUser` 方法接收两个参数,分别是表示用户的对象和一个回调函数。 其中,回调函数的返回值应为这个用户的唯一标识符:最简单的写法就是让它返回用户的 `_id`它应当是唯一的,是由 MongoDB 产生的。 类似地,`deserializeUser` 也接收两个参数,分别是在序列化时生成的标识符以及一个回调函数。在回调函数里,我们需要根据根据传入的标识符(比如 \_id返回表示用户的对象。 为了在 MongoDB 中通过 query查询语句获取 `_id` 字段,首先我们需要创建 `const ObjectID = require('mongodb').ObjectID;`;然后调用它:`new ObjectID(THE_ID)`确保添加 `mongodb@~3.6.0` 作为依赖。 你可以在下面的例子中看到:
```js
passport.serializeUser((user, done) => {

View File

@ -10,9 +10,9 @@ dashedName: set-up-passport
现在我们来创建 *Passport*,最终我们需要用它来实现用户注册和登录。 除了 Passport我们还会用 Express-session 来处理 session会话。 在客户端,我们可以用这个中间件把 session id 储存到 cookie。同时我们可以在服务器上通过这个 id 访问 session 数据。 通过这种方式,我们无需把用户的个人账号信息存到 cookie来完成用户的验证。只需要用这个 id 作为 *key* 来访问服务器上用户的数据即可。
为了在你的项目中使用 Passport首先你需要在 package.json 文件中添加依赖: `"passport": "^0.3.2"`
为了在你的项目中使用 Passport首先你需要在 package.json 文件中添加依赖: `passport@~0.4.1`
此外,还需要添加 Express-session 作为依赖。 Express-session 有许多高级特性,但我们暂时只需要了解其基础功能。 `"express-session": "^1.15.0"`
此外,还需要添加 Express-session 作为依赖。 Express-session 有许多高级特性,但我们暂时只需要了解其基础功能。 `express-session@~1.17.1`
现在,我们需要配置 session 并初始化 Passport。 请先创建变量 “session” 和 “passport” 来分别引入 “express-session” 和 “passport”。

View File

@ -10,7 +10,7 @@ dashedName: set-up-the-environment
在接下来的挑战中,我们将会用到 `chat.pug` 文件。 首先,在你的 `routes.js` 文件中为 `/chat` 添加一个处理 GET 请求的路由,并给它传入 `ensureAuthenticated`。在回调函数中,我们需要让它渲染 `chat.pug` 文件,并在响应中包含 `{ user: req.user }` 信息。 现在,请修改 `/auth/github/callback` 路由,让它可以像这样设置 user_id`req.session.user_id = req.user.id`,并在设置完成后重定向至 `/chat`
我们还需要添加 `http` `socket.io` 两个依赖项,并且像这样引入
添加 `socket.io@~2.3.0` 作为依赖项,并且在你的服务器中和 `http` (内置在 Nodejs 中)一起导入/实例化。具体如下
```javascript
const http = require('http').createServer(app);