资讯专栏INFORMATION COLUMN

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

lordharrd / 1898人阅读

摘要:前言这是一个基于实现的一个简单登入例子,对于刚上手想进一步了解,前端页面如何请求到服务层路由处理数据库操作返回结果到页面这整个过程的同学比较有用。我们来看下登入请求处理。操作演示演示用户名不存在,密码错误及成功登入。

前言

这是一个基于node实现的一个简单登入例子,对于刚上手node想进一步了解,前端页面如何请求到服务层 -> 路由处理 -> 数据库操作 -> 返回结果到页面这整个过程的同学比较有用。这个例子基于github上两个项目(文末有链接),自己整理改写,希望有需要的同学可以看到。

项目源码地址:https://github.com/linwalker/...

技术栈

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

使用mongoose来与Mongodb数据库连接交互;

前端使用react与antd-design组件;

webpack 打包构建

环境准备与运行

node.js >= 7.6

mongodb 安装

robomongo 安装 (mongodb的可视化工具)

mongodb 新建名为node-login的数据库,并开启;

npm install 安装依赖

npm run build 代码构建

node app 开启服务,可以访问localhost:3003/home

项目目录

</>复制代码

  1. node-login
  2. |-- components //页面组件
  3. |-- LoginTab.js
  4. |-- RegisterTab.js
  5. |-- controller //路由回调处理
  6. |-- user-info.js
  7. |-- models //用户模型
  8. |-- user.js
  9. |-- pages //页面js
  10. |-- home
  11. |-- home.js
  12. |-- index.js
  13. |-- main
  14. |-- routes //路由
  15. |-- static //静态文件
  16. |-- tools //webpack构建文件
  17. |-- views //页面模版
  18. |-- .babelrc
  19. |-- app.js //入口文件
  20. |-- config.js //配置文件
  21. |-- package.json
具体介绍 入口文件 - app.js

</>复制代码

  1. const Koa = require("koa");
  2. const...
  3. const app = new Koa();
  4. // 配置控制台日志中间件
  5. app.use(convert(koaLogger()));
  6. // 使用ctx.body解析中间件
  7. app.use(bodyParser());
  8. // 配置服务端模板渲染引擎中间件
  9. app.use(views(path.join(__dirname, "./view"), {
  10. extension: "ejs"
  11. }));
  12. // 配置静态资源加载中间件
  13. app.use(convert(koaStatic(
  14. path.join(__dirname , "./static")
  15. )))
  16. mongoose.Promise = global.Promise;
  17. mongoose.connect(config.database);
  18. // 初始化路由中间件
  19. app.use(routers.routes()).use(routers.allowedMethods())
  20. app.listen(3003);
  21. console.log("The server is on prot 3003")

服务主要进行数据库连接,路由处理,静态文件配置和页面模板渲染。

配置文件 - config.js

</>复制代码

  1. module.exports = {
  2. "secrect": "linwalkernodelogindemo", //暂未用到,用于后期token验证
  3. "database": "mongodb://localhost:27017/node-login"//填写本地 mongodb 连接地址
  4. };

主要设置连接mongodb数据的连接地址

用户模型 - user.js

定义登入注册的用户模型

</>复制代码

  1. const mongoose = require("mongoose");
  2. const Schema = mongoose.Schema
  3. const UserSchema = new Schema({
  4. username: {
  5. type: String,
  6. unique: true,
  7. require: true
  8. },
  9. password: {
  10. type: String,
  11. require: true
  12. },
  13. email: {
  14. type: String,
  15. }
  16. });
  17. module.exports = mongoose.model("User", UserSchema);

用户模型主要三个数据,用户名,密码和邮箱。

路由

路由总入口/routes/index.js引入所有路由,使用koa-router中间件

</>复制代码

  1. const router = require("koa-router")();
  2. const home = require("./home");
  3. const main = require("./main");
  4. const editor = require("./editor");
  5. router.use("/home", home.routes(), home.allowedMethods());
  6. router.use("/main", main.routes(), main.allowedMethods());
  7. router.use("/editor", editor.routes(), editor.allowedMethods());
  8. module.exports = router;

三个主路由为/home,/main//editor,主要来看下/home

</>复制代码

  1. const router = require("koa-router")();
  2. const userInfoController = require("./../controller/user-info");
  3. const routers = router
  4. .get("/", async (ctx) => {
  5. const title = "login home";
  6. await ctx.render("home", {
  7. title
  8. })
  9. })
  10. .post("/signup", userInfoController.signUp)
  11. .post("/signin", userInfoController.signIn)
  12. module.exports = routers;

home.jsget请求返回home页面,两个post请求,分别是注册和登入处理。我们来看下登入请求处理user-info.js

</>复制代码

  1. const User = require("./../models/user");
  2. module.exports = {
  3. async signUp (ctx) {
  4. ...
  5. },
  6. async signIn (ctx) {
  7. let result = {
  8. success: false,
  9. message: "用户不存在"
  10. };
  11. //从请求体中获得参数
  12. const { username, password } = ctx.request.body;
  13. //检查数据库中是否存在该用户名
  14. await User.findOne({
  15. username
  16. }, (err, user) => {
  17. if (err) {
  18. throw err;
  19. }
  20. if (!user) {
  21. ctx.body = result;
  22. } else {
  23. //判断密码是否正确
  24. if (password === user.password) {
  25. ctx.body = {success: true, message: "登入成功"}
  26. } else {
  27. ctx.body = {success: false, message: "密码错误"}
  28. }
  29. }
  30. })
  31. }
  32. }

登入请求处理过程为先检查用户名是否存在,在判断密码是否正确。在来看下页面发起请求的地方

登入请求

</>复制代码

  1. class LoginTab extends React.Component {
  2. handleSubmit = async(e) => {
  3. e.preventDefault();
  4. let values = await this.getFormValues();
  5. if (values) {
  6. fetch("/home/signin", {
  7. method: "POST",
  8. headers: {
  9. "Content-Type": "application/json; charset=utf-8"
  10. },
  11. body: JSON.stringify(values)
  12. }).then(res => {
  13. res.json().then(res => {
  14. Message.info(res.message);
  15. if (res.success) {
  16. location.href = "/main";
  17. }
  18. })
  19. })
  20. }
  21. }
  22. getFormValues() {
  23. let self = this;
  24. return new Promise((resolve, reject) => {
  25. self.props.form.validateFields((err, values) => {
  26. if (!err) {
  27. resolve( values );
  28. } else {
  29. reject( false );
  30. }
  31. })
  32. })
  33. }
  34. render() {
  35. const { getFieldDecorator } = this.props.form;
  36. return (
  37. ...
  38. )
  39. }
  40. }
  41. export default Form.create()(LoginTab);

表单提交按钮绑定handleSubmit事件,该事件先获取表单提交数据,再发起/home/signin的post请求,根据请求结果的success值,来决定是否跳转到成功页面。这里用到antd-design表单组件的相应属性。

操作演示

演示用户名不存在,密码错误及成功登入。

总结

使用了koa框架,主要是路由和ctx上下文的处理,没用过的同学可以点击koa2教程去看看,这是koa的一个入门教程写的很不错;

使用了mongoose操作数据库,栗子中涉及的不难,只是一个User模型,一个save保存数据和一个findOne查找,看下文档就明白,或则看下这篇文章

使用antd-design 组件

备注

这个例子主要参考了:
项目1
项目2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18999.html

相关文章

  • 第三方登入例子-GitHub授权登入node-koa)

    摘要:前言第三方登入太常见了,微信,微博,总有一个你用过。本项目源码地址第三方登入第三方登入主要基于。授权回掉处理获取在第一步授权请求成功后会给应用返回一个回掉。 前言 第三方登入太常见了,微信,微博,QQ...总有一个你用过。当然看这篇文章的你,应该还用过github登入。这篇分享是在上一篇基于node的登入例子(node-koa-mongoose)的基础增加了github账号第三方授权登...

    Bmob 评论0 收藏0
  • Node.js项目部署到阿里云服务器(CentOs)

    摘要:最近用开发了一个项目,开发完打算先部署到我自己买的阿里云学生服务器上,让客户先试用下网站良心乙方。不知道如何把项目部署到阿里云服务器,在问了飞哥哥之后,在网上找了下教程,部署成功。 最近用node.js开发了一个web项目,开发完打算先部署到我自己买的阿里云学生服务器上,让客户先试用下网站(良心乙方)。不知道如何把node.js项目部署到阿里云服务器,在问了飞哥哥之后,在网上找了下教程...

    ConardLi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<