美文网首页技术栈「跳一跳」,小程序更强大了微信小程序
腾讯云 wafer2 上手,轻松部署小程序后端!

腾讯云 wafer2 上手,轻松部署小程序后端!

作者: NanBox | 来源:发表于2017-09-27 14:39 被阅读13462次

前端程序员开发一个自己的小程序,比起学习小程序开发,更大的难点在于搭建小程序的后台。

本文从一个初学者的角度,简单介绍一下腾讯云推出的小程序解决方案 wafer2,让没有后台开发经验的程序员,也能搭建起自己的小程序后台。

简介

wafer

后台的搭建涉及到购买服务器、购买数据库,然后要在服务器上安装运行环境等。说实话,我连要在服务器上装什么都不知道。所以希望能有一个东西,帮我把这些都做好,要是再提供一些登录之类的常用接口就更好了。这就是 wafer 所做的。

其实在小程序后台配置域名的地方,就有跳转到腾讯云的链接:

进入后按照指引购买,就可以拥有一个配置好的后台。

wafer2

wafer 相对于自己搭建后台已经方便很多了,但我用起来还是感觉有难度。我不熟悉 Linux,也搞不懂如何测试代码。直到发现腾讯云又推出了 wafer2。

如果你用上了新版小程序开发工具,会在工具的右上角发现一个「腾讯云」的按钮:

这个按钮就是用来连接 wafer2 的。

我们可以直接在小程序开发工具里编写后台代码,并上传代码,后台是区分开发环境和生产环境的。

下面我们看看怎么使用 wafer2。

搭建

开发环境

搭建 wafer2 很简单,大家按照官方文档来,应该没什么问题的,这里就不赘述了。

生产环境

官方文档说的都是开发环境,要是你想部署到生产环境,有些配置需要改一下。

域名

开发环境的域名是腾讯云分配的 xxx.qcloud.la,而生产环境需要使用自己在腾讯云里的域名。

通过腾讯云管理中心注册的域名,会自动部署 HTTPS 证书。但是要备案的话,需要登记服务器 ip,而 wafer2 的服务器 ip 是没有提供给我们的。目前备案只能再买一个服务器......

绑定域名后,可以在开发工具「详情」-「腾讯云状态」确认生产环境域名:

切换到生产环境后,别忘了把客户端的接口域名也改一下。

数据库

在腾讯云管理中心里,修改生产环境 MySql 的登录密码。然后登录 phpMyAdmin,在首页可以看到 MySql 的服务器 ip 地址,记下来。

回到开发工具,找到 server/config.js,修改里面 MySql 配置的 ip 地址及登录密码:

  mysql: {
    host: '修改为生产环境 ip',
    port: 3306,
    user: 'root',
    db: 'cAuth',
    pass: '修改为生产环境密码',
    char: 'utf8mb4'
  },

在开发工具上传正式代码,再到管理中心的生产环境,点击「代码部署」。这样就完成生产环境的配置及部署了。

比外需要注意,开发环境的 MySql 是 5.7 的,而生产环境是 5.6 的。注意不要在开发的时候使用 JSON 等 MySql 5.7 才有的功能。

登录

先说一下小程序基本都会用到的登录。

使用

wafer2 的客户端及服务端 sdk,已经集成了登录逻辑,在客户端引用 sdk 后,只要调用它的 login 方法就可以实现登录了:

qcloud.login({
  success: res => {
    console.log('登录成功', res)
  },
  fail: err => {
    console.log('登录失败', err)
  }
})

登录成功会将用户数据保存在数据库 cAuth 的 cSessionInfo 表里,并将用户数据返回。

看起来很美好,但是这里面是存在一些问题的。

问题

用户登录过之后会将用户信息缓存在本地,当有缓存的时候会将用户信息直接返回。但是 sdk 中,缓存的存取都是有问题的,有缓存的情况下,会返回 undifined。

这是个很低级的错误,问题已经给官方反馈了。截止到写这篇文章,取数据的地方改了,但存的地方还没改......

所以现在要正常使用,需要到 wafer2-client-sdk/lib/login.js,找到保存用户数据的地方:

Session.set(res.skey);

修改为:

Session.set(res);

另外,还想吐槽一下,sdk 里 wx.login 和 wx.getUserInfo 是搭配使用的。

也就是说,必须要获取到用户信息,才能实现登录。而我们知道,小程序在获取用户信息时会弹窗,并且用户是可以拒绝的。拒绝后一段时间内,调用 wx.getUserInfo 都不会再弹窗。可以说 wafer2 没有考虑用户拒绝授权的情况。而这恰好是微信不提倡的做法,甚至可能导致无法通过审核。

这个问题我也向官方反馈了。

第一个接口

学习要有目的性才能保持兴趣,配置完了我们来写一个自己的接口。

wafer2 基于 Node.js 平台,使用了 Koa2 框架。

在 server/controllers 下新建文件 hello.js,输入如下代码:

module.exports = async ctx => {
  ctx.state.data = "Hello World !"
}

代码很简单,就是暴露一个返回结果是「Hello World !」的方法,「Hello World !」会被放在请求结果的 data 里。

然后我们打开 server/routes/index.js

添加一句代码:

// 测试接口
router.get('/hello', controllers.hello)

代码就只有这么多。保存之后点击「腾讯云」-「上传测试代码」,如果是第一次上传要勾上「部署后自动安装依赖」。等待上传成功,就可以测试我们的接口了。

调用 xxx.qcloud.la/weapp/hello,看是否返回以下结果:

{
  code: 0,
  data: "Hello World !"
}

恭喜!你自己开发的第一个接口已经调通了!

数据库操作

wafer2 使用了 knex 作为数据库的查询构造器,并且已经配置好了。对于有 sql 经验的程序员,可以很快的上手。

我们可以在 phpMyAdmin 里,在 cAppinfo 这个数据库里创建需要的表。

假如已经有一个「Book」的表,下面代码,简单展示了在 wafer2 里,如何对数据库进行增查改删:

const { mysql } = require('../qcloud')
const uuid = require('node-uuid')

module.exports = async ctx => {
  var id = uuid.v1()
  // 增
  var book = {
    id: id,
    name: "冰与火之歌",
    price: 88
  }
  await mysql("Book").insert(book)
  // 查
  var res = await mysql("Book").where({ id }).first()
  // 改
  await mysql("Book").update({ price: 66 }).where({ id })
  // 删
  await mysql("Book").del().where({ id })

  ctx.state.data = "OK"
}

数据库操作默认都是异步执行的,如果要等待操作完成,需要在操作语句前加上 await。

更高级的 sql 用法,可以查看 knex.js 官网

总结

我已经将自己的小程序「碰词er」后台迁移到 wafer2 了。开发的时候各种坑,给腾讯云提了一些很明显的 bug。说不定「碰词er」是第一个使用 wafer2 的小程序。

wafer2 用起来方便。我们不用懂太多后台配置的东西,前后端代码都在小程序开发工具编写,直接在开发工具上传后端代码,区分了开发、生产环境,而且目前还是免费的,虽说不知道会不会一直有免费版。

但目前缺点同样明显,比如备案不方便,登录接口不合理,sdk 有 bug 等。我还碰到服务器宕机,需要重启的情况。希望腾讯云接下来能解决这些问题。

总的来说,wafer2 使用门槛低,但现在还不够稳定。个人项目玩玩还是可以的,商业项目要用的话,建议再观察一段时间吧。

相关文章

网友评论

  • 302784b0c05d:你好,通过 wx.request 里的 data 传参,用post方法,而且header['content-type'] 为 application/x-www-form-urlencoded,在后台如何获取这些参数,也是nodejs后台??
  • 5a960d496b86:感谢作者,还想了解一下后端怎么写,腾讯云解决方案都没有非常好的教程,你这个算是最好的了。
    我想知道例如前台URL传值过来要查一个指定item应该如何写,现在一头雾水,或者去哪里可以学
  • c3e44d09385b:你好 我想问一下getuserinfo接口被废除后 怎样使用wafer2来获取openid呢?我已经被这个问题困扰很长时间了 很感谢你的回答
  • 383b7b677450:有完整的代码吗
  • 学以致用123:有缓存的情况下,会返回 undifined ,是因为源码返回的是 session.userinfo,session本身个字符串,当然没有userinfo 属性,自己在lib 的 login 里面把代码改成 session 就可以了
    NanBox:@学以致用123 是的,这是源码的一个 bug,这么久了还没改啊:sweat:
  • 9db4525721fe:我按照第一步来 访问...../weapp/hello
    返回的是
    {"code":0,"data":{}}

    看不到hello world 可能是哪里出了问题呢?
    域名备案什么的登录是正常的
    9db4525721fe:@SouthernBox 再请教一下,如果操作数据库增删改呢?
    9db4525721fe:@SouthernBox 已解决谢谢
    NanBox:@fanx_7aef 再部署一下试试?这个结果说明接口是通的
  • ea654c0426d2:你好,我修改了login.js里面的代码后,发现缓存返回的还是undefined,这个是什么情况呢
  • d6ed520d8468:请问楼主,我用wafer2部署,开发环境中测试上传图片到COS对象存储正常,改成生产环境就报错imgUrl undefined,根本上传不上COS,请问您测试时候遇到过这种情况吗?感谢。
    d6ed520d8468:@SouthernBox 后台语言换成php就正常了,谢谢老师
    NanBox:@Ray_fa76 没有呢,其他的都正常吗?
  • 8584058c5b2f:大神你好,我刚刚接触node.js,也没有配置过服务器后端,所以有些地方没有看懂。数据库那个地方,大神你提供的代码应该写在那个文件里啊?写完之后怎么让代码执行啊?
    NanBox:@ef6314172183 没错,就是这样
    ef6314172183:我也刚接触node.js 看了大神的文章,有些东西是豁然开朗!个人理解是数据操作代码写在server/controllers下的JS。然后接口写在server/routes。然后就调用接口就行了。不知可否这样理解。
    NanBox:写在 server/controllers 下的 js 文件里,写完后通过开发工具上传部署好才可以调试。
  • 7757b49daf52:请问在我调用的时候,为什么不起作用,插入不了数据,我应该在哪些地方检察,其中
    ```
    const { mysql } = require('../qcloud')
    ```
    使用的是异步插入,在表中插补了数据
    NanBox:改成同步的试试,类似这样:
    var result = await mysql("xxx").select("*").from("UserIdiomMap")
    ctx.state.data = result
    NanBox:检查一下 MySQL 配置,最简单的查询操作能查询到吗?
  • 75bf729f1154:请问在“第一个接口”的例子中,如何将查询的数据返回呢?
    NanBox:将要返回的数据存在 ctx.state.data
  • 1629e72d15a8:你好呀,请问uuid是怎么部署的?
    NanBox:你好,我是用 uuid-node 模块生成的,先安装,然后这样获取:
    var uuid = require('node-uuid')
    var id = uuid.v1()
  • kimpay:请问下大佬,”第一个接口“那一步,照着你这样弄是可以的。但是我改成了生产环境,也就是server-config.js下mysql改了生产环境的host和pass,client-config.js下的var host改成生产环境的域名(购买的域名再分配个二级域名),不再是xxxxxx.qcloud.la。按道理应该是这样操作,但是没能成功。大佬百忙下帮帮解困谢谢谢谢
    NanBox:没成功是报了什么错呢?
  • 13f6ecfddadb:请问,如果生产环境用自己的域名,那么wafer2的类似qcloud.login这样的接口还能正常使用吗?
    NanBox:@岁月风干了梦 当然可以
  • 5924ff49df88:我在用 await mysql("Book").insert(book)中增加一条记录,不知道为啥没有反应呢
    NanBox:@拒绝_4285 就这一句看不出哪里有问题
  • 28b7da8d57b2:请问你是怎么迁移的,我们是自己有接口,thinkphp框架,怎么样直接把这个文件夹上传,调用后台接口的时候调用自己原来写好的,而不是依赖server下面配置好的?
    NanBox:@YUTING_f15f 我不太懂后台,但这个 wafer2 是 node.js 的,可能用不了 PHP 的代码。
  • b95f0ca6ca78:你好还得咨询您个问题,:joy: ,我买了一个域名,为上线做准备,但是需要实名认证和备案, 现在企业认证过的公众号,绑定的小程序管理员是我,用我的微信直接可以登录小程序,在域名实名认证的时候必须填我的资料吗?我想用公司其他负责人的实名信息认证可以吗?多谢。:relaxed:
    b95f0ca6ca78:@SouthernBox 好的感谢。:relaxed:
    NanBox:@CallMeDaKing 我觉得可以的,可以再问一下腾讯云。
  • b95f0ca6ca78:请问下,楼主我微信绑定了个人的小程序和 公司的小程序两个,参照wafer2步骤,我用公司的公众号关联的小程序 去绑定腾讯云授权,扫码也是用我的微信,提示授权通过,在开发工具里面点那个腾讯云的图标想上传部署代码,一直提示我当前appid 未授权给腾讯云。。可以确定当前appid 就是企业的appid 。。。头疼了。有没有啥好的建议。。感谢了
    NanBox:@CallMeDaKing ::+1:
    b95f0ca6ca78:@SouthernBox 我解绑,从新注册了腾讯云就好了,感谢。
    NanBox:我没碰到这样的情况。你可以试一下登录腾讯云解绑小程序,再从小程序后台去绑定腾讯云。
  • 602a654dda48:请问在“第一个接口”的例子中,如果想把客户端一个值传递到后台进行处理,应该怎么写? @SouthernBox
    NanBox:客户端通过 wx.request 里的 data 传参。
    假如用 GET 请求传了一个 id,在服务端可以通过 ctx.query.id 获取到。
  • 逍客Joe:为啥 mysql 是从 qcloud 析构出来的?有点不懂为什么会是mysql儿不是mongodb, 保存在mysql的session过期后的清理是怎么操作的?

本文标题:腾讯云 wafer2 上手,轻松部署小程序后端!

本文链接:https://www.haomeiwen.com/subject/gftsextx.html