基于nodejs的短网址跳转实践

express cyanprobe 8年前 (2016-02-18) 8766次浏览 已收录 0个评论

短连接程序:

这个东西大家一定都知道,据说PHP有玩的,顺便我也用nodejs整整看,网上很多人折腾过,还有一个人折腾出来了,可惜没有分享源码,这个东西应该很好弄,我就弄来练练手。

队伍:逃走的萝卜mouqiu方块君    队长:逃走的萝卜。

设想:

自己做的思维图放上来,话说Xmind用的不是666.大体就是这样实现,当然也可以先进行一个页面的渲染在进行跳转。
dwz

主要实现代码及问题:

域名转换方法:

通过数据库中的网址id(number)进行trans进行取余数,每次在64位码表中选取位,生成“localhost/码表数字罗列”这样的效果。并将特征码存在url数据库里等待检索。
var urldb = require('../db/url_schema').urllist;
var NewUrl = function (re){
 this.user = re.user;
 this.url = re.url;
 this.content = re.content;
 }
module.exports = NewUrl;
NewUrl.prototype.create = function (callback) {
 var This=this;
 urldb.findAndModify({idsign:"X"}, [],{$inc:{'id':1}},{ new: true, upsert: true }, function (err, doc) {
 var c1 = {
 user:This.user,
 url :This.url,
 content:This.content,
 id:doc.value.id,
 shorturlcode:trans(doc.value.id)
 }
 callback(null,c1);
 });
 };
NewUrl.prototype.insert=function(c1,callback)
{
 var inc1=new urldb(c1);
 inc1.save(function(err,doc){
 var shorturlcode=doc.shorturlcode;
 return callback(null,shorturlcode);
 });
}
var secrect = "q,0,w,e,a,6,s,d,x,1,z,9,c,2,r,f,v,t,7,g,b,y,h,3,n,u,8,4,j,m,i,5,k,l,o,p,q,0,w,e,a,6,s,d,x,1,z,9,c,2,r,f,v,t,7,g,b,y,h,3,n,u,8,4,j,m,i,5,k,l,o,p";
var sec = new Array();
sec = secrect.split(",");
function trans(s) {
 var res = "";
 while (s >= 62) {
 res = sec[(s % 62)] + res;
 s = Math.round(s / 62);
 }
 if (s > 0) {
 res = sec[(s)] + res;
 }
 return (res);
}

mongoose生成自增id的问题:

开始各种google的mongoose生成自增id的问题,mongodb提供了一个自增的方法,经过测试可用。但是mongoose并没有findandmodify的方法,于是乎调用mongose底层方法实现,在通过测试发现(或者有方法未找到),mongoose转过来后函数的定义不支持mongodb的写法了,所以无法使用mongoose实现插入并自增ID,既然选择了mongoose那么就曲线救国,findandmodify可以更改一个id标记使其自增完成后作为字段名插入记录,则每次只有一个id自字段被+1,然后每次插入前读取这个字段的id值
// 链接 firstblood 集合
var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://127.0.0.1/test');
// 链接错误
db.on('error', function (error) {
    console.log(error);
});
// Schema 结构
var Schema = mongoose.Schema;
var urlSchema = new Schema({
    user: { type : String },
    url: { type: String },
   content:{type:String},
    id:{type:Number},
    shorturlcode:{type:String}
},{versionKey:false
});
urlSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);//调用底层mongoodb连接实现构造
};
// 关联 urllist -> url 表
exports.urllist = db.model('url', urlSchema,'url');
exports.db = db;

nodejs302跳转问题:

其实可以加入判断后进行渲染页面后跳转丰富更多周边功能。

var express = require('express');
var router = express.Router();
var urldb=require('../db/url_schema').urllist;
/* GET users listing. */
router.get('/:urlcode', function (req, res){
    var urlshow=req.params.urlcode;
    urldb.find({shorturlcode:urlshow},function(err,doc){
        res.writeHead(302, {
            'Location': doc.url
            //add other headers here...
        });
        res.end();
    })
});
module.exports = router;

后记:

还有一部分没有完成,原理和重点已经疏通,这个实践结束(PS:萝卜君要去武汉面试)。 github:我的github地址
dwz2
 
话说注册了自己github,新手一枚,还望各种大大,指导。另外收各种nodejs搞基人员,一起折腾一起进步。


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:基于nodejs的短网址跳转实践
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址