項目準備
啓動服務
npm i express
// server.js
// 引入 express
const express = require('express')
// 建立服務器應用程序
const app = express()
app.get('/user', async (req, res) => {
res.send('hello node.js')
})
app.listen(3001, () => {
console.log('http://localhost:3001')
})
複製代碼
在命令行運行nodemon .\server.js
命令啓動服務javascript
注:nodemon 命令須要全局安裝 nodemon(npm install --global nodemon
), 在瀏覽器訪問/user時以下,則說明開啓成功java
實現簡單的 GET 請求接口
app.get('/api/get', async (req, res) => {
res.send('hello node.js')
})
複製代碼
Send Request
發送請求// test.http
@url=http://localhost:3001/api
###
get {{url}}/user
複製代碼
如上圖,get 請求成功
操做 MongoDB 數據庫
NoSQLBooster for MongoDB
軟件npm i mongoose
// 引入 mongoose
const mongoose = require('mongoose')
// 鏈接數據庫,自動新建 ExpressAuth 庫
mongoose.connect('mongodb://localhost:27017/ExpressAuth', {
useNewUrlParser: true,
useCreateIndex: true
})
// 創建用戶表
const UserSchema = new mongoose.Schema({
username: {
type: String,
unique: true
},
password: {
type: String,
}
})
// 創建用戶數據庫模型
const User = mongoose.model('User', userSchema)
module.exports = { User }
複製代碼
簡單的 POST 請求
// server.js
app.post('/api/register', async (req, res) => {
console.log(req.body);
res.send('ok')
})
app.use(express.json()) // 設置後能夠用 req.body 獲取 POST 傳入 data
複製代碼
###
POST {{url}}/register
Content-Type: application/json
{
"username": "user1",
"password": "123456"
}
複製代碼
// server.js
app.post('/api/register', async (req, res) => {
// console.log(req.body);
const user = await User.create({
username: req.body.username,
password: req.body.password
})
res.send(user)
})
複製代碼
數據庫裏多了一條用戶數據:node
密碼 bcrypt 加密
npm i bcrypt
用戶登陸密碼解密
app.post('/api/login', async (req, res) => {
const user = await User.findOne({
username: req.body.username
})
if (!user) {
return res.status(422).send({
message: '用戶名不存在'
})
}
// bcrypt.compareSync 解密匹配,返回 boolean 值
const isPasswordValid = require('bcrypt').compareSync(
req.body.password,
user.password
)
if (!isPasswordValid) {
return res.status(422).send({
message: '密碼無效'
})
}
res.send({
user
})
})
複製代碼
登陸添加 token
npm i jsonwebtoken
// 引入 jwt
const jwt = require('jsonwebtoken')
// 解析 token 用的密鑰
const SECRET = 'token_secret'
複製代碼
/* 生成 token jwt.sign() 接受兩個參數,一個是傳入的對象,一個是自定義的密鑰 */
const token = jwt.sign({ id: String(user._id) }, SECRET)
res.send({
user,
token
})
複製代碼
這樣咱們在發送請求時,就能看到建立的 tokengit
解密 token 獲取登陸用戶
app.get('/api/profile', async (req, res) => {
const raw = String(req.headers.authorization.split(' ').pop())
// 解密 token 獲取對應的 id
const { id } = jwt.verify(raw, SECRET)
req.user = await User.findById(id)
res.send(req.user)
})
複製代碼
### 我的信息
get {{url}}/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjZDI5YjFlMTIwOGEzNDBjODRhNDcwMCIsImlhdCI6MTU1NzM2ODM5M30.hCavY5T6MEvMx9jNebInPAeCT5ge1qkxPEI6ETdKR2U
複製代碼
服務端返回以下圖,則說明解析成功github
本文參考1小時搞定NodeJs(Express)的用戶註冊、登陸和受權web
配套完整代碼和註釋見Githubmongodb