成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

基于node的登入例子(node-koa-mongoose)

lordharrd / 1833人閱讀

摘要:前言這是一個(gè)基于實(shí)現(xiàn)的一個(gè)簡(jiǎn)單登入例子,對(duì)于剛上手想進(jìn)一步了解,前端頁(yè)面如何請(qǐng)求到服務(wù)層路由處理數(shù)據(jù)庫(kù)操作返回結(jié)果到頁(yè)面這整個(gè)過(guò)程的同學(xué)比較有用。我們來(lái)看下登入請(qǐng)求處理。操作演示演示用戶(hù)名不存在,密碼錯(cuò)誤及成功登入。

前言

這是一個(gè)基于node實(shí)現(xiàn)的一個(gè)簡(jiǎn)單登入例子,對(duì)于剛上手node想進(jìn)一步了解,前端頁(yè)面如何請(qǐng)求到服務(wù)層 -> 路由處理 -> 數(shù)據(jù)庫(kù)操作 -> 返回結(jié)果到頁(yè)面這整個(gè)過(guò)程的同學(xué)比較有用。這個(gè)例子基于github上兩個(gè)項(xiàng)目(文末有鏈接),自己整理改寫(xiě),希望有需要的同學(xué)可以看到。

項(xiàng)目源碼地址:https://github.com/linwalker/...

技術(shù)棧

node 使用 Koa框架,node版本7.6以上可以直接使用async/await;

使用mongoose來(lái)與Mongodb數(shù)據(jù)庫(kù)連接交互;

前端使用react與antd-design組件;

webpack 打包構(gòu)建

環(huán)境準(zhǔn)備與運(yùn)行

node.js >= 7.6

mongodb 安裝

robomongo 安裝 (mongodb的可視化工具)

mongodb 新建名為node-login的數(shù)據(jù)庫(kù),并開(kāi)啟;

npm install 安裝依賴(lài)

npm run build 代碼構(gòu)建

node app 開(kāi)啟服務(wù),可以訪(fǎng)問(wèn)localhost:3003/home

項(xiàng)目目錄
node-login
    |-- components                   //頁(yè)面組件
        |-- LoginTab.js
        |-- RegisterTab.js
    |-- controller          //路由回調(diào)處理
        |-- user-info.js
    |-- models                 //用戶(hù)模型
        |-- user.js
    |-- pages                    //頁(yè)面js
        |-- home
            |-- home.js
            |-- index.js
        |-- main
    |-- routes                    //路由
    |-- static                    //靜態(tài)文件
    |-- tools                    //webpack構(gòu)建文件
    |-- views                    //頁(yè)面模版
    |-- .babelrc
    |-- app.js                    //入口文件
    |-- config.js                //配置文件
    |-- package.json
    
具體介紹 入口文件 - app.js
const Koa = require("koa");
const...
const app = new Koa();

// 配置控制臺(tái)日志中間件
app.use(convert(koaLogger()));

// 使用ctx.body解析中間件
app.use(bodyParser());

// 配置服務(wù)端模板渲染引擎中間件
app.use(views(path.join(__dirname, "./view"), {
    extension: "ejs"
}));

// 配置靜態(tài)資源加載中間件
app.use(convert(koaStatic(
    path.join(__dirname , "./static")
)))

mongoose.Promise = global.Promise;
mongoose.connect(config.database);

// 初始化路由中間件
app.use(routers.routes()).use(routers.allowedMethods())

app.listen(3003);
console.log("The server is on prot 3003")

服務(wù)主要進(jìn)行數(shù)據(jù)庫(kù)連接,路由處理,靜態(tài)文件配置和頁(yè)面模板渲染。

配置文件 - config.js
module.exports = {
    "secrect": "linwalkernodelogindemo", //暫未用到,用于后期token驗(yàn)證
    "database": "mongodb://localhost:27017/node-login"http://填寫(xiě)本地 mongodb 連接地址
};

主要設(shè)置連接mongodb數(shù)據(jù)的連接地址

用戶(hù)模型 - user.js

定義登入注冊(cè)的用戶(hù)模型

const mongoose = require("mongoose");
const Schema = mongoose.Schema
const UserSchema = new Schema({
    username: {
        type: String,
        unique: true,
        require: true
    },
    password: {
        type: String,
        require: true
    },
    email: {
        type: String,
    }
});

module.exports = mongoose.model("User", UserSchema);

用戶(hù)模型主要三個(gè)數(shù)據(jù),用戶(hù)名,密碼和郵箱。

路由

路由總?cè)肟?b>/routes/index.js引入所有路由,使用koa-router中間件

const router = require("koa-router")();
const home = require("./home");
const main = require("./main");
const editor = require("./editor");

router.use("/home", home.routes(), home.allowedMethods());
router.use("/main", main.routes(), main.allowedMethods());
router.use("/editor", editor.routes(), editor.allowedMethods());

module.exports = router;

三個(gè)主路由為/home,/main//editor,主要來(lái)看下/home

const router = require("koa-router")();
const userInfoController = require("./../controller/user-info");

const routers = router
    .get("/", async (ctx) => {
        const title = "login home";
        await ctx.render("home", {
            title
        })
    })
    .post("/signup", userInfoController.signUp)
    .post("/signin", userInfoController.signIn)

module.exports = routers;

home.jsget請(qǐng)求返回home頁(yè)面,兩個(gè)post請(qǐng)求,分別是注冊(cè)和登入處理。我們來(lái)看下登入請(qǐng)求處理user-info.js。

const User = require("./../models/user");

module.exports = {
    async signUp (ctx) {
        ...
    },

    async signIn (ctx) {
        let result = {
            success: false,
            message: "用戶(hù)不存在"
        };
        //從請(qǐng)求體中獲得參數(shù)
        const { username,  password } = ctx.request.body;
        //檢查數(shù)據(jù)庫(kù)中是否存在該用戶(hù)名
        await User.findOne({
            username
        }, (err, user) => {
            if (err) {
                throw err;
            }
            if (!user) {
                ctx.body = result;
            } else {
                //判斷密碼是否正確
                if (password === user.password) {
                    ctx.body = {success: true, message: "登入成功"}
                } else {
                    ctx.body = {success: false, message: "密碼錯(cuò)誤"}
                }
            }
        })
    }
}

登入請(qǐng)求處理過(guò)程為先檢查用戶(hù)名是否存在,在判斷密碼是否正確。在來(lái)看下頁(yè)面發(fā)起請(qǐng)求的地方

登入請(qǐng)求
class LoginTab extends React.Component {
    handleSubmit = async(e) => {
        e.preventDefault();
        let values = await this.getFormValues();
        if (values) {
            fetch("/home/signin", {
                method: "POST",
                headers: {
                    "Content-Type": "application/json; charset=utf-8"
                },
                body: JSON.stringify(values)
            }).then(res => {
                res.json().then(res => {
                    Message.info(res.message);
                    if (res.success) {
                        location.href = "/main";
                    }
                })
            })
        }
    }
    getFormValues() {
        let self = this;
        return new Promise((resolve, reject) => {
            self.props.form.validateFields((err, values) => {
                if (!err) {
                    resolve( values );
                } else {
                    reject( false );
                }
            })
        })
    }
    render() {
        const { getFieldDecorator } = this.props.form;
        return (
            
...
) } } export default Form.create()(LoginTab);

表單提交按鈕綁定handleSubmit事件,該事件先獲取表單提交數(shù)據(jù),再發(fā)起/home/signin的post請(qǐng)求,根據(jù)請(qǐng)求結(jié)果的success值,來(lái)決定是否跳轉(zhuǎn)到成功頁(yè)面。這里用到antd-design表單組件的相應(yīng)屬性。

操作演示

演示用戶(hù)名不存在,密碼錯(cuò)誤及成功登入。

總結(jié)

使用了koa框架,主要是路由和ctx上下文的處理,沒(méi)用過(guò)的同學(xué)可以點(diǎn)擊koa2教程去看看,這是koa的一個(gè)入門(mén)教程寫(xiě)的很不錯(cuò);

使用了mongoose操作數(shù)據(jù)庫(kù),栗子中涉及的不難,只是一個(gè)User模型,一個(gè)save保存數(shù)據(jù)和一個(gè)findOne查找,看下文檔就明白,或則看下這篇文章

使用antd-design 組件

備注

這個(gè)例子主要參考了:
項(xiàng)目1
項(xiàng)目2

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18999.html

相關(guān)文章

  • 第三方登入例子-GitHub授權(quán)登入node-koa)

    摘要:前言第三方登入太常見(jiàn)了,微信,微博,總有一個(gè)你用過(guò)。本項(xiàng)目源碼地址第三方登入第三方登入主要基于。授權(quán)回掉處理獲取在第一步授權(quán)請(qǐng)求成功后會(huì)給應(yīng)用返回一個(gè)回掉。 前言 第三方登入太常見(jiàn)了,微信,微博,QQ...總有一個(gè)你用過(guò)。當(dāng)然看這篇文章的你,應(yīng)該還用過(guò)github登入。這篇分享是在上一篇基于node的登入例子(node-koa-mongoose)的基礎(chǔ)增加了github賬號(hào)第三方授權(quán)登...

    Bmob 評(píng)論0 收藏0
  • Node.js項(xiàng)目部署到阿里云服務(wù)器(CentOs)

    摘要:最近用開(kāi)發(fā)了一個(gè)項(xiàng)目,開(kāi)發(fā)完打算先部署到我自己買(mǎi)的阿里云學(xué)生服務(wù)器上,讓客戶(hù)先試用下網(wǎng)站良心乙方。不知道如何把項(xiàng)目部署到阿里云服務(wù)器,在問(wèn)了飛哥哥之后,在網(wǎng)上找了下教程,部署成功。 最近用node.js開(kāi)發(fā)了一個(gè)web項(xiàng)目,開(kāi)發(fā)完打算先部署到我自己買(mǎi)的阿里云學(xué)生服務(wù)器上,讓客戶(hù)先試用下網(wǎng)站(良心乙方)。不知道如何把node.js項(xiàng)目部署到阿里云服務(wù)器,在問(wèn)了飛哥哥之后,在網(wǎng)上找了下教程...

    ConardLi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<