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 相关文章推荐
JS性能优化笔记搜索整理
Aug 21 Javascript
Jquery.addClass始终无效原因分析
Sep 08 Javascript
Javascript高级技巧分享
Feb 25 Javascript
全面理解JavaScript中的继承(必看)
Jun 16 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
Dec 16 Javascript
js观察者模式的弹幕案例
Nov 23 Javascript
如何在 Vue 中使用 JSX
Feb 14 Vue.js
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 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 301转向实现代码
2008/09/18 PHP
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
vue实现登录拦截
2020/06/29 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python基础教程之数字处理(math)模块详解
2014/03/25 Python
使用Python写个小监控
2016/01/27 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
css3中transition属性详解
2014/09/02 HTML / CSS
医护人员英文求职信范文
2013/11/26 职场文书
董事长岗位职责
2013/11/30 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
学校国庆节活动总结
2015/03/23 职场文书
vue 实现上传组件
2021/05/31 Vue.js
Python的property属性详细讲解
2022/04/11 Python