Node.js生成HttpStatusCode辅助类发布到npm


Posted in Javascript onApril 09, 2013

作为一个好的Restfull Api不仅在于service url的语义,可读性,幂等,正交,作为http状态码也很重要,一个好的Http Status Code给使用者一个很好的响应,比如200表示正常成功,201表示创建成功,409冲突,404资源不存在等等。所以在做一个基于node.js+mongodb+angularjs的demo时发现node.js express没有提供相应的辅助类,但是本人不喜欢将201,404这类毫无语言层次语义的东西到处充斥着,所以最后决定自己写一个,但是同时本人也很懒,不喜欢做重复的苦力活,怎么办?那就从我最熟悉的c#中HttpStatusCode枚举中copy出来吧,最后为了简便在mac上所以采用了利用node.js去解析msdn关于httpstatuscode的文档生成node.js的辅助类。

代码很简单:

var http = require('http');var fs = require('fs');
var $ = require('jquery');
var output = "httpStatusCode/index.js";
(function(){

String.format = function() {
var s = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
var reg = new RegExp("\\{" + i + "\\}", "gm");
s = s.replace(reg, arguments[i + 1]);
}
return s;
};


var options = {
host:'msdn.microsoft.com',
port:80,
path:'/zh-cn/library/system.net.httpstatuscode.aspx'
};


http.get(options,function (response) {
var html = "";
response.on("data",function (chunk) {
html += chunk;
}).on("end", function () {
handler(html);
}).on('error', function (e) {
console.log("Got error: " + e.message);
});


function getHttpStatusCode(htmlString) {
var $doc = $(html);
var rows = $doc.find("table#memberList tr:gt(0)");
var status = {};
rows.each(function(i,row){
status[$(row).find("td:eq(1)").text()] = 
parseInt($(row).find("td:eq(2)").text().match(/\d+/).toString());
});
return status;
};

function generateCode(status){
var code = "";
code += "exports.httpStatusCode = " + JSON.stringify(status) + ";";
return code;
};

function writeFile(code){
fs.writeFile(output, code, function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved " + output + "!");
}
}); 
};


function handler(html){
var status = getHttpStatusCode(html);
var code = generateCode(status);
writeFile(code);
};


});
})();

代码寄宿在github:https://github.com/greengerong/node-httpstatuscode

最终生成类为:

View Code 
exports.httpStatusCode = { 
"Continue": 100, 
"SwitchingProtocols": 101, 
"OK": 200, 
"Created": 201, 
"Accepted": 202, 
"NonAuthoritativeInformation": 203, 
"NoContent": 204, 
"ResetContent": 205, 
"PartialContent": 206, 
"MultipleChoices": 300, 
"Ambiguous": 300, 
"MovedPermanently": 301, 
"Moved": 301, 
"Found": 302, 
"Redirect": 302, 
"SeeOther": 303, 
"RedirectMethod": 303, 
"NotModified": 304, 
"UseProxy": 305, 
"Unused": 306, 
"TemporaryRedirect": 307, 
"RedirectKeepVerb": 307, 
"BadRequest": 400, 
"Unauthorized": 401, 
"PaymentRequired": 402, 
"Forbidden": 403, 
"NotFound": 404, 
"MethodNotAllowed": 405, 
"NotAcceptable": 406, 
"ProxyAuthenticationRequired": 407, 
"RequestTimeout": 408, 
"Conflict": 409, 
"Gone": 410, 
"LengthRequired": 411, 
"PreconditionFailed": 412, 
"RequestEntityTooLarge": 413, 
"RequestUriTooLong": 414, 
"UnsupportedMediaType": 415, 
"RequestedRangeNotSatisfiable": 416, 
"ExpectationFailed": 417, 
"UpgradeRequired": 426, 
"InternalServerError": 500, 
"NotImplemented": 501, 
"BadGateway": 502, 
"ServiceUnavailable": 503, 
"GatewayTimeout": 504, 
"HttpVersionNotSupported": 505 
};

最后考虑到或许还有很多像我一样懒散的人,所以共享此代码发布到了npm,只需要npm install httpstatuscode,便可以简单实用,如下是一个测试demo:

var httpStatusCode = require("httpstatuscode").httpStatusCode;var toBeEqual = function (actual,expected){
if(actual !== expected){
throw (actual + " not equal " + expected);
}
};
toBeEqual(httpStatusCode.OK,200);
toBeEqual(httpStatusCode.Created,201);
toBeEqual(httpStatusCode.BadRequest,400);
toBeEqual(httpStatusCode.InternalServerError,500);


console.log(httpStatusCode);
console.log("success");

懒人的文章总是代码多余文字,希望代码能说明一切,感谢各位能阅读。

 

Javascript 相关文章推荐
如何用javascript控制上传文件的大小
Oct 26 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
Apr 29 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
Nov 28 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
Apr 08 #Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
Apr 08 #Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 #Javascript
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 #Javascript
Jquery图片滚动与幻灯片的实例代码
Apr 08 #Javascript
Js动态添加复选框Checkbox的实例方法
Apr 08 #Javascript
JS解决url传值出现中文乱码的另类办法
Apr 08 #Javascript
You might like
PHP的分页功能
2007/03/21 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
如何使用angularJs
2017/05/08 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
学生会招新策划书
2014/02/14 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
跑吧孩子观后感
2015/06/10 职场文书
七年级英语教学反思
2016/02/15 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers