nodejs实用示例 缩址还原

 更新时间:2010年12月28日 22:28:12   作者:  
nodejs最近好红火,我也趁寒冷天气在nodejs的火炉边取暖一下。缩址还原实现代码。
思路非常简单:
1. httpserver获取需要还原的url;
2. 使用httpclient递归请求这个url,直到发现http status not in (302, 301)为止。
3. 返回还原的原url。

好吧,代码如下:
复制代码 代码如下:

var net = require('net'),
http = require('http'),
url = require('url'),
fs = require('fs');
var DEFAULT_PORTS = {
'http:': 80,
'https:': 443
};
var INDEX_TPL = fs.readFileSync('index.html');
function _write(str, res, content_type) {
if(res.jsonp_cb) {
str = res.jsonp_cb + '("' + str + '")';
}
res.writeHead(200, {
'Content-Length': str.length,
'Content-Type': content_type || 'text/plain'
});
res.end(str);
};
function expand(short_url, res) {
var info = url.parse(short_url);
// console.log('info: ' + JSON.stringify(info));
if(info.protocol != 'http:') { // 无法请求https的url?
_write(short_url, res);
return;
}
var client = http.createClient(info.port || DEFAULT_PORTS[info.protocol], info.hostname);
var path = info.pathname || '/';
if(info.search) {
path += info.search;
}
var headers = {
host: info.hostname,
'User-Agent': 'NodejsSpider/1.0'
};
var request = client.request('GET', path, headers);
request.end();
request.on('response', function (response) {
if(response.statusCode == 302 || response.statusCode == 301) {
expand(response.headers.location, res);
} else {
_write(short_url, res);
}
});
};
//expand('http://sinaurl.cn/hbMUII');
// http服务
http.createServer(function(req, res){
if(req.url.indexOf('/api?') == 0) {
var params = url.parse(req.url, true);
if(params.query && params.query.u) {
if(params.query.cb) { // 支持jsonp跨域请求
res.jsonp_cb = params.query.cb;
}
expand(params.query.u, res);
} else {
_write('', res);
}
} else {
_write(INDEX_TPL, res, 'text/html');
}
}).listen(1235);
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});

启动你的web服务器吧:
$ node urlexpand.js
打开浏览器直接访问:
http://127.0.0.1:1235/api?u=http://is.gd/imWyT
或者访问我的测试服务器:
http://yongwo.de:1235/api?u=http://is.gd/imWyT&cb=foo

相关文章

  • JavaScript中常见加密解密方法总结

    JavaScript中常见加密解密方法总结

    这篇文章主要为大家详细介绍了JavaScript中常见加密解密方法的实现,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • Javascript 模式实例 观察者模式

    Javascript 模式实例 观察者模式

    首先我们看看观察者的概念 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
    2009-10-10
  • JavaScript实现简单的倒计时效果

    JavaScript实现简单的倒计时效果

    这篇文章主要为大家详细介绍了JavaScript实现简单的倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • js replace() 文本替换你所不知的

    js replace() 文本替换你所不知的

    今天看了一个函数,功能是把形如word-word的字符串转化为wordWord
    2010-03-03
  • chart.js实现动态网页显示拆线图的效果

    chart.js实现动态网页显示拆线图的效果

    本文主要介绍了chart.js实现动态网页显示拆线图的效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • 详解写好JS条件语句的5条守则

    详解写好JS条件语句的5条守则

    这篇文章主要介绍了详解写好JS条件语句的5条守则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 小程序实现搜索框功能

    小程序实现搜索框功能

    这篇文章主要为大家详细介绍了小程序实现搜索框功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • ECMAScript中函数function类型

    ECMAScript中函数function类型

    这篇文章主要介绍了ECMAScript中函数function类型的相关资料,需要的朋友可以参考下
    2015-06-06
  • 超实用的javascript时间处理总结

    超实用的javascript时间处理总结

    在大家日常开发中常常会要对时间进行处理,以达到大家想要的效果,所以本文整理了一些javascript常用的时间处理类,有需要的可以参考借鉴。
    2016-08-08
  • JS实现简单的天数计算器完整实例

    JS实现简单的天数计算器完整实例

    这篇文章主要介绍了JS实现简单的天数计算器,结合完整实例形式分析了javascript针对日期的获取及天数运算相关操作技巧,需要的朋友可以参考下
    2017-04-04

最新评论