短连接程序:
这个东西大家一定都知道,据说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搞基人员,一起折腾一起进步。
