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 判断 object 的特定类转载
Feb 01 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
Aug 15 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
全面了解js中的script标签
Jul 04 Javascript
移动端js触摸事件详解
Sep 18 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
Sep 27 Javascript
Angular封装表单控件及思想总结
Dec 11 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下安装配置fckeditor编辑器的方法
2011/03/02 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
解放web程序员的输入验证
2006/10/06 Javascript
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
Python rstrip()方法实例详解
2018/11/11 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
如何进行Linux分区优化
2013/02/12 面试题
工程专业求职自荐书范文
2014/02/08 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
2015年教师节主持词
2015/07/03 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python