「Node学习」Koa+Mysql2+Vue前后端综合例子

学习目的

通过Koa搭建一个HTTP服务器;通过Mysql2来连接数据库;通过Vue来写前端页面的一个简单例子。前端页面灰常简单,就两个标题,主要是为了学习如何通过这三个技术来实现前后端综合开发的。

代码实现

直接上代码,注释已写在代码里,下面的是Node服务器代码:

'use strict';

var Koa = require('koa');
var app = new Koa();
var router = require('koa-router')();
var bodyparse = require('koa-bodyparser');
var fs = require('fs');
var path = require('path');
//node链接mysql的驱动程序,驱动程序就是为了让我们node写的sql语句发送给mysql并且返回处理结果
var mysql = require('mysql2');

var home = async (ctx,next) => {
    console.log('请求进入');
    ctx.response.type = 'text/html';
    ctx.response.body = fs.createReadStream(path.join(__dirname,'html','home.html'));
};

//写的一个返回json数据的接口,然后会在html页面通过ajax来调用接口来更改页面内容,而不是通过服务器的模板语言渲染进去
var getInfo = async (ctx,next)=>{
    console.log('获取用户信息');
    ctx.response.type = 'application/json';
    //因为是异步调用,所以数据库的query需要放在promise对象里面
    var tmp = await new Promise(function(success,fail){
        //创建数据库链接的对象,此时还没有链接mysql数据库
        var connection = mysql.createConnection({
            host:'localhost',
            port:3306,
            user:'root',
            password:'wobuzhidao',
            database:'testinfo'
        });
        //调用connect来链接数据库,接收一个回调函数,参数是err,如果为null则是链接成功,否则失败
        connection.connect(function(err) {
            if(err) {
                console.log(err);
            }else {
                
                console.log('连接数据库成功');
                //连接数据库成功后,可以发送sql语句了,这里是选取test3表里的所有数据
                //结果会在回调函数里返回,第一个参数是错误信息,第二个是返回结果,类型是数组
                connection.query('select *from test3',function(err,rows) {
                    if(err) {
                        fail(err);
                    }else {
                        //之前提到过的,await后面一般是需要一个promise对象的,只要调用success就会把结果返回
                        success(rows);
                        //完成数据库的访问后关闭连接
                        connection.end();
                    }
                });
            }
        });
        
    });
    console.log(tmp);
    //转为json字符串返回给浏览器
    ctx.response.body = JSON.stringify(tmp);
};
router.get('/home',home);
router.get('/getInfo',getInfo);
app.use(bodyparse());
app.use(router.routes());
app.listen(3000);
console.log('服务器启动了');

下面是前端页面的简单代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <!-- ajax的请求库,灰常好用,使用的是promise语法 -->
    <script src="https://cdn.bootcss.com/axios/0.18.0/axios.js"></script>
    <!-- vue是一个用来构建前端页面的框架,也是神器 -->
    <script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
    <title>首页</title>
</head>
<body>
    <div id="main">
        <h1>{{info.name}}</h1>
        <h2>{{info.type}}</h2>
    </div>
</body>
</html>
<script>

    //创建一个Vue对象
    var vm = new Vue({
        el:'#main',
        data:{
            info: {
                name:'空',
                type:1
            }
        },
        //当实例被创建完后,vue对象会调用该方法
        created:function(){
                axios.get('http://localhost:3000/getInfo')
                .then(function(data){
                    console.log('获取到了信息',data.data);
                    //vue实现了数据绑定,只要data里面的数据改变,页面就会重新渲染
                    vm.info = data.data[0];
                })
                .catch(function(err) {
                     console.log('获取信息失败',err);
                });
            }
    });
    
</script>

上面就是一个非常简单的一个前后端开发的例子,旨在明白如何返回页面,如何返回json数据,并且如何在前端使用该数据。

在学习廖大的教程的时候,教程里有提到使用HTML模板来进行页面的渲染,其实我觉得真的不是很好,比如现在需要的场景是安卓和苹果客户端也获取JSON数据,如果使用模板渲染,返回的是一整个HTML页面,并且如果采用REST接口规范,可以很好的做到页面和数据的分离。所以,强烈不推荐使用服务器的模板来渲染页面,而是尽量遵守REST规范。(REST规范:REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。

本节涉及到的知识点做个推荐链接:

如果不习惯使用mysql2的原生sql语句的写法,可以使用下面的这个ORM(对象关系映射,把数据库的表映射为JS原生对象,这样只需要操作对象就可以完成对数据库的增删改查)框架:

开发过程中推荐使用ORM框架,这个文档讲解的非常详细,不再写文章记录了。以后学习深入的情况下会去写一个简易版的ORM框架,来了解其原理。

猜你喜欢

转载自blog.csdn.net/weixin_34250709/article/details/87634879