前几天学校来了一个微软Azure的头来做讲座,听他吹的把Azure吹的是棒的不要不要的。我真想试试看呢。再之,Vscode对于Azure的支持也很棒,那我就来试一试吧。 我考虑了一下,决定写一个很简单的从Web读取和写入数据库。数据库我就用Azure的云数据库,读写数据库的逻辑用Azure function实现。这样数据库的用户名和密码不会在前端裸奔。
我记得如果数据库读写较少的话,隔壁Google的Firebase是直接提供免费服务的,那Azure呢?刷新出Azure首页,复杂繁多的功能,各种不认识的术语密密麻麻地陈列在主页上。
嗯,这些术语好像都照过面,但是不熟啊。我只是想用一个最简单的SQL数据库。
Azure的产品种类繁多,规模也从小到大。就拿SQL数据库为例子,从一个月几刀到几千刀不等。神奇的是,你想要使用SQL数据库,你先要开一个SQL server实例,紧接着再在实例下面创建数据库。看看隔壁LeanCloud,数据库上手直接用,哪有这么复杂。数据库的位置倒有很多的选择,这个不错。
管理数据库可以用Azure的Web端的查询编辑器,也可以使用它的PC客户端。PC客户端又是一个不轻的东西,但它的功能的确要比Web端强上不少。支持一些预置脚本,比如查询前100条数据。支持GUI的方式创建和修改数据库。PC端的确比Web端强上不少。但是为什么PC端的功能不能再Web端实现呢?毕竟是云端数据库,不是本地数据库,都是靠使用API实现的。
Azure的SQL数据库是T-SQL,一个不常见的SQL数据库。语法上与其他数据库有小小的出出入。但是问题在于,T-SQL的教程非常的稀少。在微软官方那,我也没有看到一份令我满意的教程。也就这么慢慢摸索,我搞定了数据库。
Azure Function的开发就较为简单了。 NPM直接安装官方的开发工具。对与Function的触发器,我选择了HTTP Trigger,也就是以HTTP请求作为触发器。除了HTTP,还有时间和数据库内容发生改变作为触发器。除了Trigger,还有一个比较重要的概念是Input Binding和Output Binding。简单来说就是什么作为Input,什么作为Output.常见的选项有Queue,和各种数据库,比如Blog Storage(用来储存二进制文件),Cosomos Database。
从Function的一些基础概念绕了出来,实现一下我想要的功能想必是不难,只要没坑。微软有一个Tutorial关于从建立数据库到查询数据库。我用的是Typescirpt,便选了JS那一套。官方推荐的是一个叫Tedious的第三方库,看着很简单,官网也很简陋。我也就照抄了官网上的一些代码片段,将它们拼了起来,运行竟然报错。我看了两遍,跟官网上的长的一样啊。果断问了一下,竟然是没有写Error的Callback函数。
在等答案的过程中,我还去看了一眼微软官方的教程Quickstart: Use Node.js to query an Azure SQL database我简单跑了一跑,很好,没有什么问题。比那个Tedious官方的Get Started强上很多。我又在官方的基础上加了很多我自己的实现。比如数据库查询成功后的操作。一个天坑出现了,无论我怎么改我的代码,查询成功后的操作永远不执行。而且Debug过程中,即使程序没有抛出异常,每查询一次数据库,Debug都会退出一次。我再三检查,甚至打量起了从微软教程里扒来的代码。终于找到个罪魁祸首,就那一行代码。
1 | var Connection = require('tedious').Connection; |
那个process.exit()是几个意思?
代码修葺中。。。。。
发布函数很简单,直接在VsCode里操作插件就好了。但是上传一个函数,我得想三个到四个名字。一个Azure Function的名字,一个Resource Group的名字,一个Storage Group(我也不知道这个干嘛的)名字,还有一个Function App名字。起这些名字才是最纠结的时候。毕竟我都不知道这些名字都用在什么地方。
最后一步是处理云端中函数的执行环境。打开Portal里的Kudu。在Debug Console里进入程序目录,执行npm install
。网页的终端真的是卡的不要不要的。安装个NPM,连安装时候的Output都显示不出来。让我真的是摸不着脑袋,鬼知道有没有安装成功。
简单来说使用经历不是那么喜人,算然VsCode的兼容很好,但很多时候都显得操作冗余。对于个人开发者来说,Azure价格要高一些,又显得较为麻烦,并不会是我的第一选择。再之,网上教程还不多,还有那个令人讨厌的Portal。一眼望去,满屏的滚动条,甚至两行的滚动条。
下次我肯定选LeanCloud或者Firebase。