前端漸漸趨向後端化,工程化,自動化開發,掌握一門後端語言成了咱們必備的不可少階段,Node的出現讓咱們可以搭建了簡單運算的後臺,實現全棧的開發,如今經過幾個階段來開發一套基於VUE開發的Node後臺系統,區塊式的記錄一些乾貨。javascript
安裝: npm install express
引用: const express = require("express");
複製代碼
設置端口號前端
const app = express();
const port = process.env.PORT || 5000;
app.listen(port,()=>{
console.log(`Server running on port ${port}`);
})
複製代碼
在控制檯中運行node server.js
,便可以開出http://localhost:5000
的請求鏈接,那麼咱們能夠根據請求鏈接編寫出第一個請求接口java
app.get("/",(req,res) => {
res.send("Hellow World!")
})
複製代碼
因爲每次保存都要從新執行命令,故咱們能夠安裝npm install nodemon -g
避免每次初始執行node
有了第一步的操做咱們已經可以成功訪問到了一個自定義接口數據了,那麼如今咱們須要根據數據庫的數據執行咱們的接口,在Node中運用封裝好的MongoDB
進行操做(此處若有不明白能夠看下以前總結的推文)git
安裝:npm install mongoose
引用: const MongoClient = require("mongodb").MongoClient;
複製代碼
建立一個文件keys.js
咱們將數據庫鏈接所有編寫進去,方便後期直接調用github
module.exports = {
url: 'mongodb://localhost:27017',
dbName: 'restful-api-prod',
secretOrkey: 'secret' //token 調用
}
複製代碼
在server.js
頁面中進行引入進行鏈接mongodbweb
class Mongodb{
constructor(conf) { //class原型下的構造函數
//保存conf到構造的集合中
this.conf=conf //成員變量
//鏈接
this.client = new MongoClient(conf.url,{useNewUrlParser: true}) //建立客戶端
this.client.connect( err => { //有自動重連的機制
if(err) {
throw err
}
console.log('鏈接數據庫成功');
});
}
}
module.exports = new Mongodb(conf);
複製代碼
建立users.js
,此處頁面編寫將會涉及到 登陸,註冊,設置Token,密碼加密,用戶,郵箱是否存在判斷,Token識別獲取信息等。mongodb
引入router進行接口路由編寫數據庫
const express = require("express");
const router = express.Router(); //接口請求
// api/users/test
router.get("/test",(req,res) => {
res.json({msg:"login works"})
})
module.exports = router;
複製代碼
建立的文件須要到server.js
中引用express
const users = require("./routes/api/users");
app.use("/api/users",users);
複製代碼
Schema的數據模型建立
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// Create Schema
const UserSchema = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
avatar: { //頭像
type: String
},
identity: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});
module.exports = User = mongoose.model('users', UserSchema);
複製代碼
方便後期接口調試的須要安裝下postman,接下來的請求是POST請求,也是相對get請求比較麻煩的一點,POST的請求須要安裝第三方的模塊
npm i body-parser
複製代碼
在 server.js 中引用
const bodyParser = require("body-parser");
//使用body-parser中間件
app.use(bodyParser.urlencoded({extended:false})); //開啓往post傳送數據
app.use(bodyParser.json()); //讓數據json化
複製代碼
引入Schema建立的數據模型 若是引用了那麼咱們能夠根據模型直接 User.findOne 就能在數據庫中查詢,可是未知緣由,在執行時一直沒進去,便接下來都使用了封裝的Promise請求進行操做
router.post("/register",async(req,res) => {})
var userFind = mongoHelper.findOne("test",{email: req.body.email});
複製代碼
const newUser = new User({
name: req.body.name,
email: req.body.email,
avatar,
password:req.body.password,
identity:req.body.identity
})
複製代碼
密碼加密操做安裝(使用參考npm) npm install bcrypt -S
await mongoHelper.insertOne("test",newUser);
return res.status(200).json(newUser); //打印在控制檯的數據
複製代碼
安裝:npm i gravatar
const avatar = gravatar.url(req.body.email, {s: '200', r: 'pg', d: 'mm'});
複製代碼
router.post("/login",async(req,res) => {})
mongoHelper.findOne("test",{email}).then(user => {})
複製代碼
安裝 npm install jsonwebtoken
複製代碼
在判斷匹配密碼成功後進行操做,此處須要注意到的是 token: "Bearer "+token
jwt.sign("規則","加密名字","過時時間","箭頭函數")
const rule = {
id:user.id,
name:user.name,
avatar:user.avatar,
identity: user.identity,
};
jwt.sign(rule,keys.secretOrkey,{expiresIn: 3600},(err,token) => {
if(err) throw err;
res.json({
success: true,
token: "Bearer "+token
})
})
複製代碼
安裝 npm i passport-jwt passport
引用 const passport = require("passport"); //對請求進行身份驗證
初始化 app.use(passport.initialize());
代碼抽離模式 require("./config/passport")(passport); //傳對象過去
router.get("/current","驗證token",(req,res) => {
res.json(req.user);
})
複製代碼
建立passport文件直接在這個頁面操做再拋出,在passport-jwt官網中引用須要的數據
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require("mongoose");
// const User = mongoose.model("users");
const keys =require("../config/keys");
const mongoHelper = require('../models/mongoHelper')
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrkey;
複製代碼
//server
router.get("/current",passport.authenticate("jwt",{session:false}),(req,res) => {
res.json(req.user);
})
//passport.authenticate 驗證token
複製代碼
註冊
代碼已上傳github,請給star,後續繼續更新,多謝支持