一直想看看前后端分离是什么样的感觉,所以就试试看了,因为java感觉有点麻烦,就用了go语言来代替后端。
原理:
当浏览器请求访问数据时将数据提交到nodejs写的服务器中,nodejs将数据解析处理后发送给Golang写的后台服务器(请求协议可自定义),Golang写的后台服务器主要是数据库方面操作,操作完成后将数据发送给nodejs服务器,然后nodejs服务器将数据或页面渲染出来。
0.准备工作
1.Go语言开发环境(我go语言的编辑器是IntelliJ IDEA)
2.nodejs开发环境(我nodejs的编辑器是vs code)
3.分别安装 golang和nodejs版hprose插件
资料参考:
hprose官网
Hprose for Golang 用户手册
Hprose for Node.js 用户手册
koajs官网
koa中文文档
koa官网示例
1.后台服务器编写
代码:
package main
import (
"github.com/hprose/hprose-golang/rpc"//<===hprose
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"//<===mysql驱动
"log"
)
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func mysqlTestConnect(str string) string{//数据库查询
fmt.Print(str)
db, err := sql.Open("mysql", "root:换成你数据库的密码@tcp(localhost:3306)/test")
if err != nil {
log.Fatalf("Open database error: %s\n", err)
}
defer db.Close()
err = db.Ping()
checkErr(err)
rows, err := db.Query("SELECT * FROM t_test")
checkErr(err)
var tmp string=""
for rows.Next() {
var id int
var name string
rows.Columns()
err = rows.Scan(&id, &name)
checkErr(err)
tmp=tmp+"id:"+string(id)+" name:"+name+"<br/>"
}
return tmp
}
func main(){
server := rpc.NewTCPServer("tcp4://0.0.0.0:10010/")//创建服务具体
server.AddFunction("客户端调用函数名", mysqlTestConnect)//添加访问函数
server.Start()//启动
}
2.前台服务器编写
代码:
const koa = require('koa');//这里以koa 框架为例
const app = new koa();
var hprose = require("hprose");//hprose
var client = hprose.Client.create("tcp4://127.0.0.1:10010/", ['客户端调用函数名']);//创建客户端连接
app.use(function* () {
var dt= yield new Promise(function (resolve) {
client.客户端调用函数名("请求参数", function (result) {
resolve(result);
})
});
this.type = 'text/html;charset=utf-8';
this.body = dt;
});
app.listen(3000);
3.效果
浏览器访问127.0.0.1:3000地址