求despacito什么意思粤语版音频文件下载

DailyNode增加feed支持, Noder 们可以订阅了 - CNode技术社区
积分: 2995
Node.js 忠实粉丝,搭建rednode 用于推动 Node 在国内发展
终于增加了feed, Noder可以通过订阅的方式快速了解 Node land 发生的大事和新火爆的模块, 视频
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的  此前实现了个数据转发功能,但是要建本地服务器,还需要一个简易的路由功能。因为只是用于本地服务器用于自己测试用,所以不需要太完善的路由功能,所以也就不去使用express框架,而是自己实现一个简易路由,可以针对自己的需求来定制路由功能。
  在制作路由功能之前,我先写了一张路由表,表明了自己大概想要实现的四种路由转换效果,这四种效果也正是自己项目需要的: 
"/my/**/*":"func:testFun",
"index":"url:index.html",
"test?v=*":"url:my*.html",
"/public/bi*/**/*":"url:public/**/*"
  第一种:只要我的地址是/my/**/*的格式,**/*意思就是my目录下任意目录目录的任意文件都会触发testFun这个方法。比如/my/test/index.html或者/my/1/2/3/index.html都会触发testFun,因为会触发这个方法,所以路由不会进行页面输出。
  第二种:就是常规的,当我访问/index时,将index.html页面输出。
  第三种:如果我输入为test?v=index,输出的页面则为myindex.html,两边的*即数值相同。
  第四种:用于静态资源的获取,当我访问/public/bi*/**/*时,就会将public下的任意文件输出。比如我的请求路径为/public/biz009/stylesheets/css/main.css,那么路由转换出的文件路径即为:public/stylesheets/css/main.css
  抱着实现这四种效果的目的,就开始了自己的实现。
  第一段代码,mimes里的内容比较长,所以就用...代替了。
  首先把正则写好,正则主要用于替换**和*,替换成相应的正则字符串。
  然后实现Router的构造函数,对传入的参数进行简易处理,传入的参数可以直接为上面的对象,也可以为json文件的路径,构造函数中会用eval转换成对象,之所以不用JSON.parse是因为其对json格式的要求比较严,不方便书写。
  后面再继承一下事件类,方便外部调用事件绑定。
"use strict";
var fs = require("fs");
var url = require("url");
var events = require("events");
var util = require("util");
var path = require("path");
var mimes = '...'.split(",");
var ALL_FOLDER_REG = /\/\*\*\//g;
var ALL_FOLDER_REG_STR = '/([\\w._-]*\/)*';  //匹配XXX/XXX/XX/
var ALL_FILES_REG = /\*+/g;
var ALL_FILES_REG_STR = '[\\w._-]+';  //匹配XX
var noop = function () {};
var Router = function (arg) {
this.methods = {};
if ((typeof arg == "object") && !(arg instanceof Array)) {
this.maps =
} else if (typeof arg == "string") {
var json = fs.readFileSync(arg).toString();
this.maps = eval('(' + json + ')');
} catch (e) {
console.log(e);
this.maps = {};
this.maps = {};
this.handleMaps();
//继承事件类
util.inherits(Router, events.EventEmitter);
var rp = Router.
rp.constructor = R
  上面代码中再构造函数里还执行了一个handleMaps方法,该方法是用于将路由表中的路由地址和目标地址进行处理后,再放到数组里保存起来。__A__代表**,__B__代表*,这两个也对应了上面写的正则字符串:ALL_FOLDER_REG_STR &和 &ALL_FILES_REG_STR
rp.handleMaps = function () {
this.filters = [];
//存放路由地址
this.address = [];
//存放目标地址
for (var k in this.maps) {
var fil = trim(k);
var ad = trim(this.maps[k]);
fil = fil.charAt(0) == "/" ? fil : ("/" + fil);
ad = ad.replace(ALL_FOLDER_REG, '__A__').replace(ALL_FILES_REG, '__B__');
fil = fil.replace(/\?/g , "\\?").replace(ALL_FOLDER_REG, '__A__').replace(ALL_FILES_REG, '__B__');
this.filters.push(fil);
this.address.push(ad);
  然后还要实现一个保存function的方法,因为要根据路由表执行方法,所以有了set方法:
rp.set = function (name, func) {
if (!name)return;
this.methods[name] = (func instanceof Function) ? func :
  前面的都实现好后,就要实现具体的路由方法,这段代码相对比较简单,当发生请求时,跟据请求地址,遍历上面保存的路由地址,并将路由地址中的__A__和__B__转成相应正则字符串,再通过RegExp实现正则实例,对请求地址进行匹配。如果匹配成功,当前索引 i 即为目标地址中的索引。
  然后对字符串进行分割,判断如果是url则进行相应的url处理,如果是function则执行保存的方法,并且传入req,res。
rp.route = function (req, res) {
var urlobj = url.parse(req.url);
var pathname = urlobj.
var i = 0;
var match = false;
for (; i & this.filters. i++) {
fil = this.filters[i];
var reg = new RegExp("^" + fil.replace(/__A__/g, ALL_FOLDER_REG_STR).replace(/__B__/g, ALL_FILES_REG_STR) + "$");
if (reg.test(fil.indexOf("?") &= 0 ? (pathname = urlobj.path) : pathname)) {
match = true;
if (match) {
var ad = this.address[i];
var array = ad.split(':' , 2);
if(array[0] === "url"){
//如果是url则查找相应url的文件
var filepath = getpath(fil , array[1] , pathname);
this.emit("match", filepath , pathname);
this.routeTo(res , filepath);
}else if(array[0] === "func" && (array[1] in this.methods)){
//如果是func则执行保存在methods里的方法
this.methods[array[1]].call(this , req , res , pathname);
throw new Error("route Error");
this.emit("notmatch");
this.error(res);
  上面代码中有个getpath方法,该方法就是将**和*映射为实际地址,也即使将/public/biz009/stylesheets/css/main.css 转换为public/stylesheets/css/main.css 的逻辑。
function getpath(fil , ad , pathname){
var filepath =
if(/__(A|B)__/g.test(fil) && /__(A|B)__/g.test(ad)){
var ay = fil.split("__");
var dy = ad.split("__");
var index = 0;
for(var k=0;k&ay.k++){
if(!ay[k]) continue;
if (ay[k] === 'A' || ay[k] === 'B') {
reg = new RegExp(ay[k] === 'A' ? ALL_FOLDER_REG_STR : ALL_FILES_REG_STR);
//扫描路径,当遇到AB关键字时处理,如果两者不相等,停下dy的扫描,继续执行对ay的扫描,直至遇到相等数值
while(index & dy.length){
if(dy[index] === 'A' || dy[index] === 'B'){
if(dy[index] === ay[k]){
dy[index] = pathname.match(reg)[0];
reg = new RegExp(ay[k]);
pathname = pathname.replace(reg, '');
filepath =
dy.join("");
filepath = path.normalize(filepath);
filepath = filepath.charAt(0) == path.sep ? filepath.substring(1,filepath.length):
  说说实现原理:先将路由地址和目标地址转成数组
/public/bi*/**/* ==& ['/public/bi','B','','A','','B']
public/**/*
==& ['public','A','','B']
  而当我请求/public/biz009/stylesheets/css/main.css 的时候,即要将
['/public/bi','B','','A','','B']
['/public/bi','z009','','/stylesheets/css/','','main.css']
  然后再跟上面的['public','A','','B']对应,即
['public','A','','B'] ==& ['public','/stylesheets/css/','','main.css']
  实现逻辑为:
  请求的pathname还是为/public/biz009/stylesheets/css/main.css ,扫描['/public/bi','B','','A','','B']:
  扫描第一个即'/public/bi'时,将/public/bi转成正则,通过匹配将/public/biz009/stylesheets/css/main.css 变为:z009/stylesheets/css/main.css
  扫描第二个即B,因为B所以用上面的ALL_FILES_REG_STR 即 [\w._-]+匹配,将从而获取到了B对应的z009,同时将pathname变成/stylesheets/css/main.css,此时再扫描&['public','A','','B'],扫描到A或B的时候,发现是A而不是对应的B,因此不更新扫描索引,所以上面没有进行index++,而是直接break,继续下一步。
  扫描第三个''所以不管继续扫描
  扫描第四个为A,同上,获取到/stylesheets/css/,并将pathname变成main.css,此时再扫描['public','A','','B'],扫描索引还停留在A上,所以再进行判断,结果两者都是A,因此将['public','A','','B']中的A替换成了/stylesheets/css/,即变成了['public','/stylesheets/css/','','B']
  然后同上继续扫描直至扫描完,就会将['public','A','','B']变成['public','/stylesheets/css/','','main.css'];
  最后再join出来的结果:public/stylesheets/css/main.css就是转换出来的最终路径,也就是匹配的文件路径。
  还有两个方法一个是输出文件内容,一个就是404了,比较简单,就不作赘述
rp.routeTo = function(res , filepath){
var that = this;
fs.stat(filepath , function(err , stats){
if(err || !stats.isFile()){
that.emit("error" , err || (new Error("path is not file")));
that.error(res);
var fileKind = filepath.substring((filepath.lastIndexOf(".")+1)||0 , filepath.length);
var readstream = fs.createReadStream(filepath);
var index = mimes.indexOf('.'+fileKind);
var options = {
'Cache-Control':'no-cache',
'Content-Type': mimes[index+1]+';charset=utf-8',
'Content-Length':stats.size
res.writeHead(200, options);
readstream.pipe(res);
rp.error = function(res){
res.writeHead(404);
res.end("404 not found");
  该源码放在github上
Views(...) Comments()一、修改server.js
var http = require("http");
var url = require("url"); //导入内置url模块
function start(route){
function onRequest(request, response){
var pathname = url.parse(request.url). //提取url
console.log("Request received.");
console.log("Request for " + pathname + " received.")
route(pathname) //路由
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello,World,Node.js");
response.end();
http.createServer(onRequest).listen(8888);
console.log("Server has started.")
exports.start = start
二、增加router.js
内容如下,
function route(pathname){
console.log("About to route a request for" + pathname);
exports.route = route
三、修改index.js
var server = require("./server")
var router = require("./router")
server.start(router.route)
阅读(...) 评论()菜鸟学习nodejs--express(二)路由
菜鸟学习nodejs--express(二)路由
什么是路由
路由这个次不是nodejs专属,在web应用程序中就有路由,路由描述应用程序是否以及如何对调http(超文本传输协议)请求进行应答,当用户在与应用程序或者网站交互的时候,浏览器就会生成这些请求。
路由只是个用来定义应用程序中http请求的最终点的术语,所以如果希望应用程序能够做点什么,那么就必须使用路由了。
Express中的路由
在Express使用HTTP动词来定义路由,HTTP动词描述对服务的请求类型,最为可能用到的动词Get,Post。
1. GET–从服务器获取数据
2. POST–将数据发送给服务器
其他的也有一些如:PUT,Delete,HEAD,OPTION,TRACE。
node.js路由的从无到有
我们先创建一个没有使用路由的应用程序吧。如我们上一片博客,我们新建express_routing文件夹,在文件夹内Shift+鼠标右键,选择在此处打开命令窗口,然后输入:
express express_routing
cd express_routing && npm install
上边的命令就是创建Express项目,并引入一些相应的模块。
打开app.js,在倒数第二行假如app.listen(3000);加入端口号。
在命令窗口继续输入:
node app.js
然后再浏览器输入,然后观察页面
可是如果我们输入的地址是的话,会出现404的错误,这就是about没有路由可以使用,那么我们改如何使用呢。
其实我们平时在做web项目的时候一直再用路由,只是可能我们不知道那就叫路由,如我们常用的从服务器获取数据的GET请求,给服务器数据POST。接下来我们分别介绍一下
添加GET路由
为了使用GET路由,我们需要Get HTTP请求,在上边的没有路由的例子中,打开app.js在var app = express()下边加上下边的代码
app.get('/about',function(req,res){
res.send('孟海滨是个大帅哥');
运行改js,node app.js,在浏览器输入,这样我们的这个程序就写完了。看看效果如何。
添加POST路由
我们说完了添加GET路由,那么接下来我们说一下POST路由,添加POST路由和添加GET路由是一样的,只是把动词换做了post,如下:
app.post('/',function(req,res){
res.send(req.body);
在这个示例中,应用程序接收post请求,送到index页面,并将数据输送到浏览器中。
新建一个文件夹express_post,在该文件夹下打开控制命令窗口。输入:
express express_post
cd epxress_post && npm install
在app.js中添加app.listen(3000);
在生成的程序中,打开view–&index.jade,添加如下代码
form(mehtod='post',action='/')
First name
input(name='user[first_name]')
input(name='user[last_name]')
input(type='submit',value='Save')
在浏览器输入,我们会看到浏览器出现了这个界面
然后我们输入一些信息,就会在地址栏出现我们输入的信息了。
使用路由传送参数
在web项目中,我们通常使用路由来传递参数,并且根据参数做相应的回应。例如下边的url
department/456
第一个url是用户ID位123的信息显示,第二个是部门id是456的信息显示。而且nodejs同样也支持这种方式。
1.创建Express站点
express express_param
cd epxress_param && npm install
2.在app.js中添加如下代码
app.get('/users/:id', function(req, res){
res.send('用户ID是' + req.params.id);
app.listen(3000);
3.启动项目
node app.js
4.在浏览器输入:,查看结果。
注意:你可能发现了,我每次都是把路由放入到了app.js,如果我们的页面需要大量的数据传输,可能使我们的程序特别复杂,难以维护,所以我们需要用一个类似于web项目的js文件来专门写这些东西,而这个Nodejs已经为我们考虑好,那就是我们的route文件夹下的index.js文件,我们可以直接写在这里边,在我们的app.js中写上app.get('/',routes.index);就可以了
使用本地变量
在res.render函数中,本地变量的使用要掌握关键所在,设置要在视图层展示的数据。
将数据传递到视图层。
我们可能对数据要进行一些处理。例如拼接字符串,计算等。无论做什么,都需要在展示之前处理好。
app.js中添加如下代码
app.get('/', function(req, res){
var user = {
first_name: 'Keyser',
surname: 'Soze',
address: 'Next door',
facebook_friends: '4'
res.render('index.jade', { title: 'User', user: user });
index.jade中添加如下代码:
h3 First Name
p= user.first_name
h3 Surname
p= user.surname
h3 Address
p= user.address
h3 Facebook Friends
p= user.facebook_friends
执行node app.js,我们会看到如下结果
我们接着在上一篇的Express的基础上来讲了在node.js中获取和传输数据,使用参数等的方法,其实无非就是一个GET,POST,参数的使用。那么Express到底是干什么的呢。
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。 说白了,一个快速为我们创建web前段的框架。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 despacito 翻译 的文章

 

随机推荐