标签:node.js http program require
var http = require(‘http‘);
http.createServer(function(req,res){
res.writeHead(200,{‘Content-Type‘:‘text/plain‘});
res.end("I‘m writting program with Nodejs");
}).listen(3000,"127.0.0.1");
console.log("Server is running at ‘127.0.0.1:3000‘")
打开页面,显示Hello World
安装模块:npm install [module_name],下载成功之后,在程序中使用需要请求才可以使用,例如:
var module_name = require(‘module_name‘);
例如:使用underscore.js库,首先需要在命令行中npm install underscore,然后require之后就可以使用。
var _ = require(‘underscore‘);
_.each([1,2,3],function(num){
console.log("underscore.js says " + num);
})
sudo npm install -g moduleName //全局安装模块
npm uninstall moduleName //卸载模块
npm docs moduleName //查询模块主页
npm view moduleName // 查看模块的package.json文件夹
npm view moduleName version// 查看模块最新版本
npm list //查看当前目录已经安装的node包
npm bugs moduleName //查看项目的bug
npm search moduleName //在命令行搜索npm包
var http = require(‘http‘),
urls = [‘taobao.com‘,‘baidu.com‘,‘douban.com‘];
function fetchPage(url){
var start = new Date();
http.get({host:url},function(res){
console.log("got response: "+url);
console.log("request tock ",new Date()-start,‘ms‘);
})
}
for(var i = 0; i < urls.length; i++){
fetchPage(urls[i])
}
<p
>之后再弹出警告框。$(function () {
$(‘p‘).hide(‘fast‘,function(){
alert("The paragraph is now hidden");
});
});
函数可以作为参数传递到另一个函数中,然后被调用。
function haveBreakfast(food,drink,callback){
console.log("Having breakfast of " + food + ", " + drink);
if(callback && typeof(callback) === "function"){
callback();
}
}
haveBreakfast("toast","coffee",function(){
console.log("finished breakfast!")
})
var fs = require("fs");
fs.readFile("somefile.txt","utf8",function(err,data){
if(err) throw err;
console.log(data);
});
var http = require("http");
http.get({host:"baidu.com"}, function (res) {
console.log("Got response: " + res.statusCode);//状态码
console.log("Headers: " + res.headers);//头信息
res.on(‘data‘,function(d){//返回网页源代码
process.stdout.write(d);
})
}).on("error",function(e){
console.log("Got error: " + e.message);
});
var fs = require("fs"),
http = require("http");
http.get({host:"taobao.com"}, function (res) {
console.log("taobao.com");
}).on("error",function(e){
console.log(e.message);
})
fs.readFile("a.txt","utf8",function(err,data){
if(err) throw err;
console.log(data);
})
http.get({host:"baidu.com"}, function (res) {
console.log("baidu.com");
}).on("error",function(e){
console.log(e.message);
})
fs.readFile("b.txt","utf8",function(err,data){
if(err) throw err;
console.log(data);
})
var http = require("http");
function fetchPage(){
console.log("fetching page");
http.get({host:"douban.com"},function(res){//要爬的网址
console.log("data returned from page");
res.on("data",function(d){//返回该网页的源码
process.stdout.write(d)//将网页源码输出
})
}).on("error",function(e){
console.log("There was an error " + e)
})
}
function fetchapi(){
console.log("fetching api");
http.get({host:"movie.douban.com"},function(res){
console.log("data returned from the api");
}).on("error",function(e){
console.log("There was an er ror " + e);
})
}
fetchPage();
fetchapi();
检查响应头,在chrome中安装Live HTTP Headers扩展插件
var http = require(‘http‘);
http.createServer(function(req,res){//创建了新的Web服务器对象,匿名函数告诉Web服务器,每当接收到请求时会发生什么。
res.writeHead(501,{‘Content-Type‘:‘text/plain‘});//加入响应HTTP头
res.writeHead(301,{‘Location‘:‘http://www.baidu.com‘});//重定向,发送了301响应代码以及位置头,告诉客户端重定向到哪里。
res.end("I‘m writting program with Nodejs");
}).listen(3000,"127.0.0.1");//定义了Web服务器的端口和主机
console.log("Server is running at ‘127.0.0.1:3000‘")
100 客户端可以继续
101 指示服务器正根据 Upgrade 头切换协议
200 请求正常成功
201 指示请求成功并在服务器上创建了一个新资源
202 指示已接受请求进行处理但处理尚未完成
203 指示客户端呈现的元信息并不源自服务器
204 指示请求成功但没有返回新信息
205 指示代理应该 重置导致请求被发送的文档视图
206 指示服务器已完成对资源的部分 GET 请求
300 请求的资源对应于表示形式集合中的某种表示形式,每种表示形式都有自己的特定位置
301 指示已经将资源永久地移动到了某个新位置,并且将来的引用应将新 URI 用于其请求
302 指示已经将资源暂时地移动到了另一个位置,但将来的引用仍应使用原来的 URI 访问该资源。 保留此定义是为了向后兼容。SC_FOUND 现在是首选定义
303 指示可在另一个 URI 之下找到该请求的响应
304 指示条件 GET 操作发现资源可用但不可修改
305 指示必须 通过 Location 字段给定的代理访问请求资源
307 指示请求的资源暂时驻留在另一个 URI 之下。临时 URI 应该 通过响应中的 Location 字段提供
400 指示客户端发送的请求在语法上不正确
401 指示请求需要进行 HTTP 验证
402 保留此代码以备将来使用
403 指示服务器理解请求但拒绝完成它
404 指示请求的资源不可用
405 指示 Request-Line 中指定的方法不支持 Request-URI 标识的资源
406 指示请求标识的资源只能生成响应实体,根据请求中发送的 accept 头,这些响应实体具有不可接受的内容特征
407 指示客户端必须 首先通过代理验证其自身
408 指示客户端没有在服务器准备等待的时间内生成请求
409 指示由于与当前资源状态冲突请求无法完成
410 指示资源在服务器上不再可用并且不知道转发地址。应该 认为此条件是永久性的
411 指示在没有定义 Content-Length 的情况下无法处理请求
412 指示在服务器上测试一个或多个请求头字段中给出的前提时,该前提被求值为 false
413 指示因为请求实体大于服务器愿意或能够处理的实体,所以服务器拒绝处理请求
414 指示因为 Request-URI 的长度大于服务器愿意解释的 Request-URI 长度,所以服务器拒绝为请求提供服务
415 指示因为请求实体的格式不受请求方法的请求资源支持,所以服务器拒绝为请求提供服务
416 指示服务器无法服务于请求的字节范围
417 指示服务器无法服务于请求的字节范围
500 指示 HTTP 服务器内存在错误使服务器无法完成请求
501 指示 HTTP 服务器不支持完成请求所需的功能
502 指示 HTTP 服务器在充当代理或网关时从它参考的服务器接收到一个无效响应
503 指示 HTTP 服务器暂时过载,并且无法处理请求
504 指示服务器在充当网关或代理时没有从上游服务器接收到及时的响应
505 指示服务器不支持或拒绝支持请求消息中使用的 HTTP 协议版本
路由是指应用程序要响应的请求
var url = require("url");
var requestURL = "http://daily.zhihu.com/story/4688312";
console.log(url.parse(requestURL).hostname);//获取主机名称
console.log(url.parse(requestURL).port);//获取端口
console.log(url.parse(requestURL).pathname);//获取路径名称
下面例子通过URL创建对于许多不同请求进行响应的服务器,这是基础层面的,比较复杂,可以通过使用Express
var http = require("http");
var url = require("url");
http.createServer(function(req,res){
var pathname = url.parse(req.url).pathname;
if(pathname ===‘/‘){
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("home page\n")
}
if(pathname === ‘/about‘){
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("about")
}
if(pathname === ‘/yll‘){
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("my name is yll.")
}
if(pathname === "/redirect"){
res.writeHead(301,{"Location":"/"});
res.end();
}
else{
res.writeHead(404,{"Content-Type":"text/plain"});
res.end("page not found!");
}
}).listen(3000,"127.0.0.1");
console.log("server running at http://127.0.0.1:3000");
var http = require("http");
var options = {
host:"shapeshed.com",
port:80,
path:"/"
};
http.get(options,function(res) {
if (res.statusCode === 200) {
console.log("The site is up!");
}
else {
console.log("The Site is down!");
}
}).on("error",function(e){
console.log("error");
})
在文件夹中放入node.exe和app.js,把以上语句保存为.cmd文件,则自动执行
var HTTP = require(‘http‘);
var queryServer = HTTP.createServer(queryConnectionHandler);
queryServer.listen(1333, function (err) {
console.log(‘query server listen at: %d‘, 1333);
if (err) throw err;
});
function queryConnectionHandler(req, res) {
var args = require(‘url‘).parse(req.url.toLowerCase(), true);
var a = args.query.a;//获得参数a
var b = args.query.b;//获得参数b
var states = {
error: function () {
res.writeHead(200, {
‘Content-Type‘: ‘text/plain‘,
‘Access-Control-Allow-Origin‘: ‘*‘
});
res.end(‘false‘);
},
ok: function () {
res.writeHead(200, {
‘Content-Type‘: ‘text/plain‘,
‘Access-Control-Allow-Origin‘: ‘*‘
});
res.end(‘ok‘);
},
message: function (obj) {
res.writeHead(200, {
‘Content-Type‘: ‘application/json;charset=utf-8‘,
‘Access-Control-Allow-Origin‘: ‘*‘
});
res.end(JSON.stringify(obj));
}
};
// 这里写具体实现
states.message(addTwoInt(a,b));
// states.message(/* 这里返回值 */);
}
function addTwoInt(a,b){
a = parseInt(a);
b = parseInt(b);
var c = a + b;
return c;
}
将函数或者变量exports出去,以供别的js文件调用
function add(teacher){
console.log("Add Teacher:" + teacher)
}
exports.add = add;
b.js
var teacher = require(‘./a‘);
teaher.add("111");
var fs = require("fs");
var data = "Some Data I want to write to a file";
fs.writeFile("file.txt",data,"utf8",function(err){
if(!err){
console.log("ok")
}else{
throw err;
}
});
var fs = require("fs")
fs.readFile("file.txt","utf8",function(err,data){
if(!err){
console.log(data);
}else{
throw err;
}
})
console.log(process.env.PATH)
console.log("Debugging message");
function notDefined(){
try{
someFunction();//undefined
}catch(e){
console.err(e);
}
}
notDefined();
var sum = 0;
var arr = new Array(1000000);
for(var i = 0; i < arr.length; i++){
arr[i] = Math.random();
}
console.time("for-loop-1");
for(var i in arr){
sum += arr[i];
}
console.timeEnd("for-loop-1");
console.time("for-loop-2");
for(var i = 0; i < arr.length; i++){//效率更高
sum += arr[i];
}
console.timeEnd("for-loop-2");
function notDefined(){
console.trace();
try{
someFunction();
}catch(e){
console.error(e);
}
}
notDefined();
var foo = function(){
var a = 3, b = 5;
// debugger;
var bar = function(){
var b = 7; c = 11;
a += b + c;
// debugger;
}
bar();
// debugger;
};
foo();
var assert = require("assert");
assert.equal("8",8); // 沉默是金
assert.strictEqual("8",8); //抛出错误
exports.firstTest = function(test){//每个测试都声明成exports.testName(描述)
test.expect(1);//n为期望的断言数
test.strictEqual("hello","hello");
test.done();//避免通过假测试,完成之后一定要调用test.done()表示测试完成
}
exports.secendTest = function(test){
test.expect(1);
test.strictEqual("hello","there");
test.done();
}
var fs = require("fs");
exports.asyncTest = function(test){
fs.stat("file.txt",function(err,stats){
test.expect(2);
test.strictEqual(err,null);
test.notStrictEqual(stats.size,0);
test.done();//容易忘记
});
}
var vows = require("vows");
var assert = require("assert");
vows.describe("Compare String").addBatch({ // 描述 Description,对测试的描述
"when comparing the same stirngs":{ // 上下文 Context,测试运行的上下文
topic:"hello", // 主题 Topic,测试的什么
"they should be equal":function(topic){ //宣告 Vow,期望在测试中发生什么
assert.strictEqual(topic,"ello");
}
},
"when conparing different stirngs":{
topic:"hello",
"they should not be equal":function(topic){
assert.notStrictEqual(topic,"there");
}
}
}).run();
var vows = require("vows");
var assert = require("assert");
var fs = require("fs");
vows.describe("Async testing").addBatch({
"When using fs.stat on a file":{
topic:function(){
fs.stat("file.txt",this.callback);//必须要有this.callback
},
"it should be present": function(err,stat){
assert.notStrictEqual(err,null);
},
"it should not be empry":function(err,stat){
assert.notStrictEqual(stat.size,0)
}
}
}).run();
var port = process.env.PORT || 3000;//随机分配端口
var http = require(‘http‘);
http.createServer(function(req,res){
res.writeHead(200,{‘Content-Type‘:‘text/plain‘});
res.end("I‘m writting program with Nodejs");
}).listen(port);//更改端口
<script src = "/socket.io/socket.io.js"></script>
<script>
var socket = io.connect("http://127.0.0.1:3000"); //连接服务器
socket.on("message",function(data){//侦听在“message”事件上接受的数据
alert(data.text)
})
socket.emit("fromClient",{text:"message from client"});//浏览器发信息给服务器
</script>
app.js内容:
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
fs.readFile("./index.html",function(error,data){
res.writeHead(200,{"Content.Type":"text/html"});
res.end(data,"utf-8");
})
}).listen(3000,"127.0.0.1");
var io = require("socket.io").listen(server);//将Socket.IO绑定到服务器,可以侦听事件
io.sockets.on("connection",function(socket){//侦听连接事件,注意sockets和socket
console.log("User connected");
socket.emit("message",{text:"you hava receive message from server!"});//从服务器将数据发送给单个客户的
// socket.broadcast.emit("message",{text:"you hava receive message from server!"});//给已连接的客户端发送数据
socket.on("disconnect",function(){//侦听断开连接事件
console.log("User disconnected!");
})
socket.on("fromClient",function(data){
console.log(data.text);
})
})
var http = require("http");
http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"application/json"});
res.end(‘{"name":"yll","age":"22","home":"huozhou"}‘);
}).listen(3000,"127.0.0.1");
console.log("Server running at 3000");
var obj = {
name:"yll",
age :"22"
}
myJson = JSON.stringify(obj);//将javaScript对象obj转换为JSON
console.log(myJson);//输出{"name":"yll","age":"22"}
myObj = JSON.parse(myJson);//将Json转换为javaScript对象
console.log(myObj)//输出{ name: ‘yll‘, age: ‘22‘ }
var http = require("http");
var data = "";
var tweets = "";
var options = {
host:"api.twitter.com",
path:"/1.1/search/tweets.json?q=%23node.js"
};
var request = http.get(options,function(res){
res.on("data",function(chunk){
console.log(chunk)
data += chunk;
})
res.on("end",function(){
tweets = JSON.parse(data);
for(var i = 0; i < tweets.results.length; i++){
console.log(tweets.results[i].text);
}
});
res.on("error",function(err){
console.log("there was an error: " + err.message);
})
})
console.log(process.pid)
process.on("exit",function(){
console.log("exited");
});
process.on("uncaughtException",function(err){
console.error(err.stack);
});
process.stdin.resume();//防止脚本在初始化从stdin的读取时退出
process.on("SIGINT",function(){
console.log("Got a SIGINT. Exiting");
process.exit(0);//退出进程
})
在process中,可以设置这些信号的侦听器并据此响应
process.stdin.resume();//防止脚本在初始化从stdin的读取时退出
process.on("SIGTERM",function(){
console.log("Got a SIGTERM. Exiting");
process.exit(0);//退出进程
})
#! /usr/bin/env node
console.log("hello world");//需要将脚本设置为可执行
[ ‘node’,
‘/Users/yll/百度云同步盘/macbook/nodenote/test’,
‘one’,
‘two’,
‘three’ ]
#! /usr/bin/env node
console.log(process.argv);//输出[ ‘node‘, ‘/Users/yll/百度云同步盘/macbook/nodenote/test‘ ]
var spawn = require("child_process").spawn;
var ping = spawn("ls",["www.baidu.com"]);
ping.stdout.setEncoding("utf8");//必须对指定数据进行编码,否则显示的是原始流
ping.stdout.on("data",function(data){
console.log(data)
})
var spawn = require("child_process").spawn;
var ping = spawn("ping",["www.baidu.com"]);
ping.on("exit",function(code,signal){//侦听子进程退出事件
console.log("child process was killed with a " + signal + "signal");
})
ping.kill("SIGINT");//中断子进程
var fork = require("child_process").fork;
var child = fork(__dirname+"/child.js");
child.on("message",function(m){
console.log("p:",m);
})
child.send({message:"hello,child!"})
process.on("message",function(m){
console.log("zi:",m);
})
process.send({message:"hello parent!"})
var cluster = require("cluster");
var http = require("http");
var cpus = require("os").cpus().length;//系统cpu数量
if(cluster.isMaster){
console.log("Master process started with PID: ",process.pid);
for(var i = 0; i < cpus; i++){
cluster.fork();
}
cluster.on("exit",function(worker){//侦听进程死亡事件
console.log("worker " + worker.process.pid + " died");
cluster.fork();
})
}else{
console.log("Worker process started with PID: " ,process.pid);
http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("hello world\n");
}).listen(3000);
}
var target = document.getElementById("target");
target.addEventListener("click",function(){
alert("click event fired.");
},false);
var EventEmitter = require("events").EventEmitter;
var ee = new EventEmitter();
//加入上述代码,就可以添加事件和侦听器了。
ee.on("message",function(data){//侦听器侦听事件并在事件触发时处理它。
console.log(data);//emit的第二个参数传递给了匿名函数使用
})
ee.emit("message","This emits a message.")//第一个参数是对事件进行描述的字符串,与侦听器匹配
通过HTTP演示事件
var http = require("http");
http.get({host:"baidu.com"}, function (res) {
res.on(‘data‘,function(d){//这是一个来自Events模块的事件侦听器
process.stdout.write(d);
})
}).on("error",function(e){
console.log("Got error: " + e.message);
});
var EventEmitter = require("events").EventEmitter;
var pingPong = new EventEmitter();
setTimeout(function(){
console.log("Send firstping");
pingPong.emit("ping");
},2000);
pingPong.on("ping",function(){
console.log("Got Ping");
setTimeout(function(){
pingPong.emit("pong");
},2000);
});
pingPong.on("pong",function(){
console.log("Got Pong");
setTimeout(function(){
pingPong.emit("ping");
},2000);
});
// 动态编写事件侦听器程序
var logPing = function(){
console.log("4s后增加一个事件侦听器")
}
setTimeout(function(){
pingPong.on("ping",logPing);
},4000)
setTimeout(function(){
pingPong.removeListener("ping",logPing);//12s后移除增加的事件
},12000)
var fs = require("fs");
fs.readFile("a.txt",function(err,data){
if(err){
throw err;
}else{
console.log(data)
}
})
var buffer = new Buffer(8);//创建带有8个字节的缓冲区
//得到buffer为:<Buffer 50 59 40 01 01 00 00 00>
//缓冲区所代表的是计算机上所分配的原始内存。
console.log(buffer.toString());
//得到:‘\u0000 \u0000\u0000\u0000\u0000\u0000\u0000‘
var buffer = new Buffer([85,86]);//85是字符U
console.log(buffer.toString("utf8"));//将编码传递给缓冲区,输出字符UV
var buffer = new Buffer(8);
buffer.write("hi","utf8");//写入缓冲区,控制台中输出1,说明该编码占用1个字节
buffer.toString()
buffer.write(" buffer",2,"utf8");//向缓冲区追加数据,2表示偏移量(从0开始)
buffer.toString();//控制台输出hi buffer
var buffer2 = new Buffer(8);
buffer.copy(buffer2);//将buffer复制给buffer2
buffer2.toString();//控制台输出hi buffer
使用流来读写文件,若想读入所有数据,必须将其连接到一个变量中。
var fs = require("fs");
var stream = fs.ReadStream("a.txt");
var data = "";
stream.on("data",function(chunk){
data += chunk;
console.log("read some data");
});
stream.on("close",function(){
console.log("all the data is read");
// console.log(data)
})
var fs = require("fs");
var readableStream = fs.ReadStream("a.txt");
var writableStream = fs.WriteStream("out.txt");
readableStream.setEncoding("utf8");
readableStream.on("data",function(chunk){
writableStream.write(chunk);
})
readableStream.on("close",function(){
writableStream.end();
})
var fs = require("fs");
var readableStream = fs.ReadStream("a.txt");
var writableStream = fs.WriteStream("out.txt");
readableStream.pipe(writableStream);
var http = require("http");
var fs = require("fs");
http.createServer(function(req,res){
var mp3 = "红玫瑰.mp3";
var stat = fs.statSync(mp3);
res.writeHead(200,{
"Content-Type":"audio/mpeg",
"Content-Length":stat.size
})
var readableStream = fs.createReadStream(mp3);
readableStream.pipe(res);
}).listen(3000,"127.0.0.1");
console.log("Server is running at ‘127.0.0.1:3000‘")
var http = require("http");
var fs = require("fs");
var writableStream = fs.WriteStream("a.jpg");
var address = "http://g.hiphotos.baidu.com/image/pic/item/94cad1c8a786c917399b1438cb3d70cf3bc75712.jpg";
var request = http.get(address,function(res){
res.on("data",function(chunk){
writableStream.write(chunk);
console.log("get data");
})
res.on("end",function(){
console.log("over")
})
res.on("error",function(err){
console.log("error : ",err.message);
})
})
var connect = require("connect");
var http = require("http");
var app = connect()
.use(nothingMiddleware)//仅仅起到传递到helloWorld的工作,而helloWorld返回响应
.use(addHeader)
.use(forceDomain("127.0.0.1:3000"))//将用户强制到单个域上,例如输入:localhost:3000——127.0.0.1:3000
.use(filterByIp([‘127.0.0.1‘]))//限定用户的ip
.use(nineToFive)
.use(helloWorld)
function nothingMiddleware(req,res,next){
next();//当next()回调函数被调用时,中间件就完成了工作,请求被传递到了下一个中间件或者应用层。
}
function addHeader(req,res,next){//给应用程序发送的任何响应添加自定义头。
res.setHeader("X-Custom-Header","My header content");
next();
}
function nineToFive(req,res,next){//使用中间件进行访问控制,时间在早上9点到下午5点之间可以打开,其他时间关闭。
var currentHour = new Date().getHours();
if(currentHour < 9 || currentHour >17){
res.writeHead(503,{"Content-Type":"text/plain"});
res.end("we are closed");
}else{
next();
}
}
function forceDomain(domain){//将用户强制到单个域上
domain = domain || false;
return function(req,res,next){
if(domain && (req.headers.host != domain)){
res.writeHead(301,{"Location":"http://" + domain + req.url});
res.end();
}else{
next();
}
}
}
function filterByIp(ips){//按IP地址限制访问
var ips = ips || [];
return function(req,res,next){
if(ips.indexOf(req.connection.remoteAddress) == -1){
res.writeHead(401,{"Content-Type":"text/plain"});
res.write("sorry");
res.end();
}else{
next();
}
}
}
function helloWorld(req,res){
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("hi! helloe world!");//是用res.end,当响应发送之后即完成了请求的处理。
}
http.Server(app).listen(3000,"127.0.0.1");
console.log("server....")
Express使用HTTP动词来定义路由,HTTP动词描述对服务器的请求类型
HTTP动词:
当加载页面时,浏览器使用GET请求获取HTML,CSS,JavaScript和图片文件;在提交表单的时候,使用POST请求。
app.get("/about",function(req,res){
res.send("hello from the about route"!);//发送响应
})
在index.jade加入以下带代码,以便在index试图中添加表单
form(method="post",action="/")
fieldset
legend Add a user
p
label First name
input(name="user[first_name]")
p
label Last name
input(name="user[surname]")
p
input(type="submit",value="Save")
在app.js中添加一个接收POST请求的路由
app.post("/",function(req,res){
res.send(req.body);
})
http://127.0.0.1:3000/users/12
将以下内容添加到app.js文件的routes节中:
app.get("/users/:id",function(req,res){
res.send("show content for user id " + req.params.id);
})
将路由移到一个单独的文件或不同的文件中,随后在主app.js文件中请求这些路由
var routes = require("./routes")
这样就可以在主应用程序中以routes.index来使用
app.get("/",routes.index);
在routes文件夹中,包含路由声明文件index.js
exports.index = function(req,res){
res.render("index",{title:"Express"})
}
app.get("/",function(req,res){
res.render("index.jade",{title:"My site"});
})
以上代码定义了:
res.render("page.jade",{layout:false})
可以设置要在视图中展示的数据,将数据传递到视图层。
app.get("/",function(req,res){
var user = {
firstName: "Lord",
surname: "Lucan",
address:"I‘m not telling"
};
res.rend("index.jade",{title:"User",user:user});
})
这样,数据就可以在视图中使用,在views/index.jade模版中访问
h1 Accessing data
h3 First Name
p = user.firstName
h3 Surname
p = user.surname
‘<div class="wrapper">
<h1>My holiday in Prague</h1>
<p>I had a great holidy.</p>
<img src="images/photo.jpg" alt="Me on holiday"/>
</div>
.wrapper
h1 My holiday in Prague
p I had a great holidy.
img(src="images/photo.jpg",alt="Me on holiday")
<html
></html
><section id="wrapper"></section
><p class="highlight"></p
><section id="wrapper" class="class_name"></section
><section class="first second third"></section
><h1>Very important heading</h1
><p><span></span></p>
<p>Text can be over many lines after a pipe symbol<p>
- var foo = "bar" // 必须加引号
p Foo is #{foo}!——编译后——<p>Foo is bar!</p>
- users = ["Sally","Joseph","Michael","Sanjay"]
- each user in users
p = #{user}
- for user in users
p = user
- obj = {first_name:"George", surname:"Ornbo"}
- each val,key in obj
li #{key}: #{val}
````
<div class="se-preview-section-delimiter"></div>
### 19.4 条件
<div class="se-preview-section-delimiter"></div>
<div class="se-preview-section-delimiter"></div>
###19.5 内联JavaScript
<div class="se-preview-section-delimiter"></div>
script alert(“use inline javascript in jade!”);
<div class="se-preview-section-delimiter"></div>
### 19.6 包含
- 包含:页面组成部分(页眉,页脚,边栏),将网站的公共部分移到单一的文件中
<div class="se-preview-section-delimiter"></div>
- Jade通过include关键字后跟想要包含的模版来支持包含功能
-
<div class="se-preview-section-delimiter"></div>
html
body
include includes/header
上述代码从views/includes/header.jade文件中包含代码
<div class="se-preview-section-delimiter"></div>
### 19.7 Mixin:代码的包含
<div class="se-preview-section-delimiter"></div>
mixin users(users)
ul
each user in users
li = #{user}
- users = [“Krist”,”Kurt”,”Dave”]
mixin users(users) //一旦定义了mixin,就可以使用它,并在模版中重用
<div class="se-preview-section-delimiter"></div>
## 20 执行效率
* 以下代码在浏览器中执行,用函数和不用函数,效率相差5倍,解释:
<div class="se-preview-section-delimiter"></div>
// function foo(){
for(var i = 1; i <= 10; i++){
console.time(i);
for(var j = 0; j < 256*256*256; j++){
}
console.timeEnd(i);
}
// }
// foo();
“`
标签:node.js http program require
原文地址:http://blog.csdn.net/u013819585/article/details/45566487