短连接程序:
这个东西大家一定都知道,据说PHP有玩的,顺便我也用nodejs整整看,网上很多人折腾过,还有一个人折腾出来了,可惜没有分享源码,这个东西应该很好弄,我就弄来练练手。
设想:
自己做的思维图放上来,话说Xmind用的不是666.大体就是这样实现,当然也可以先进行一个页面的渲染在进行跳转。
主要实现代码及问题:
域名转换方法:
通过数据库中的网址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地址
话说注册了自己github,新手一枚,还望各种大大,指导。另外收各种nodejs搞基人员,一起折腾一起进步。