C蛮的全栈之路-序章 技术栈选择与全栈工程师
C蛮的全栈之路-node篇(一) 环境布置
C蛮的全栈之路-node篇(二) 实战一:自动发博客html
---------------- 我是分割线 --------------node
光看不写,收获一定不高。
我们从一个实际功能开始把node用起来。mysql
这里有个连接,说天天6点发出阅读量最高。那么咱们会但愿先把内容准备好,而后6点的时候自动发出。
那么这个需求要怎么实现。咱们一步一步作起来。redis
---------------- 分析 --------------sql
考虑作法,好比有这些思路:
一、博客园自己提供的定时发博客的办法
二、博客园提供的API
三、模拟登录操做博客园后台
翻一下后台,博客自身没有提供这个功能,但在“设置”底部有一个“MetaWeblog访问地址: http://rpc.cnblogs.com/metaweblog/bolee”。
说明支持MetaWeblog接口API。
定时功能满地都是,成熟的很,因此须要作的主要就是要实现一个调用MetaWeblog发布博客的功能。express
---------------- 准备工做 --------------npm
上GitHub,搜MetaWeblog,找JavaScript的资源,就找到了“node-modules/metaweblog”。
简单看一眼,里头实现了一个metaweblog的client,正是咱们须要的。
那么创建一个工程目录,用npm install metaweblog拿下来。
它依赖xml2json,这玩意当然性能好,不过依赖node-gpy,麻烦。从GitHub找个node-xml2json做为替换,一样npm取下来换上。
这样准备工做就齐全了。json
---------------- 开工 --------------框架
看一下metaweblog的接口。主要用这两个API。
Post metaWeblog.getPost(postid, username, password);
bool metaWeblog.editPost(postid, username, password, post, publish);
可见从getPost拿到随笔,用editPost传publish=true就能够发布了。
Post的结构里必填的部分以下:
dateTime dateCreated
string description
string title
OK!开始编码:
var MetaWeblog = require('metaweblog').MetaWeblog; var rpcurl = 'http://rpc.cnblogs.com/metaweblog/你的昵称'; var username = '你的昵称'; var password = '你的密码'; var postid = '你要发布的随笔的连接末尾的数字'; var publish = true; var blog = new MetaWeblog(rpcurl); // GetPostByPostID blog.getPost(postid, username, password, function(err, post) { });
跑起来看一眼返回的post是这样的。
能够看到,内容是xmlrpc转成的JSON,里头有一大堆过路节点,实际有用的内容不过是一些name-value对,那么咱们来一段代码把过路节点干掉,剩下纯粹的name-value对。
function jsonGetNameValue(obj) { if (typeof(obj) != 'object') { return {}; } var name = obj['name']; var value = obj['value']; var ret = {}; if(name != undefined && value != undefined) { ret[name] = value; } for(var key in obj) { extend(ret, jsonGetNameValue(obj[key])); } return ret; }
如今再看看jsonGetNameValue(post)的内容:
这就舒服多了,咱们想要的Post结构的内容都在里头。这样就能够调用editPost了。
// GetPostByPostID blog.getPost(postid, username, password, function(err, post) { var ret = jsonGetNameValue(post); var editedPost = {'dateCreated': parseCNBlogIsoDatetime(ret['dateCreated']['datetime']['iso8601']), 'description': ret['description']['string'].toString(), 'title': ret['title']['string']}; // publish blog.editPost(postid, username, password, editedPost, publish, function(err, editResult) { console.log(JSON.stringify(editResult)); }); }); // 返回{"params":{"param":{"value":{"boolean":1}}}}
跑起来看一眼,输出了true。
确认一下,果真已经发布出去了。
---------------- ESLint --------------
用npm装一下ESLint,VSCode里装个ESLint扩展,配好后报出一些错误,都解决掉,把格式顺一顺。
这样第一个版本就出炉了。
还有什么是能够作的呢?能够考虑来个ES6版本,加上错误处理等。
---------------- 功能点 --------------
npm、GitHub、ESLint等,这个例子没有express、koa什么的框架,也没有什么redis、mysql、MongoDB等周边的东西。
做为第一个例子算比较单纯了。