什么是node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。 Node 是一个让 JavaScript 运行在服务端的开发平台。
模块和包的区别
Package.json文件的作用
实现一个简单的http服务器
var http = require('http');
var path = require('path');
var fs = require('fs');
var mime = require('mime');
http.createServer(function(req, res) {
res.render=function(filename){
fs.readFile(filename, function(err, data) {
if (err) {
res.end('文件不存在');
} else {
res.setHeader('Content-Type', mime.getType(filename));
res.end(data);
}
})
};
if (req.url === '/' || req.url === '/index.html') {
res.render(path.join(__dirname, 'publish', req.url));
} else if (req.url === '/show.html') {
res.render(path.join(__dirname, 'publish', req.url));
} else {
res.render(path.join(__dirname, 'publish', req.url));
}
}).listen(9090, function() {
console.log("http://localhost:9090")
})
模块化
关注的点:
1、该模块要封装什么代码
2、代码有用到外部的数据吗?如果用到,是否需要通过参数将数据传递到当前模块中
3、当前模块需要对外暴露的东西(module.exports)的值
将上述代码模块化:
var http = require('http');
var context=require('./context.js')
var router=require('./router.js')
var config=require('./config.js')
http.createServer(function(req, res) {
//获取资源目录
context(req,res);
router(req,res);
}).listen(config.port, function() {
console.log("http://localhost:9090")
})
context.js
var fs = require('fs');
var mime = require('mime');
module.exports=function(req,res)
{
res.render=function(filename){
fs.readFile(filename, function(err, data) {
if (err) {
res.end('文件不存在');
} else {
res.setHeader('Content-Type', mime.getType(filename));
res.end(data);
}
})
};
}
router.js
var path = require('path');
var config=require('./config.js')
module.exports=function(req,res){
if (req.url === '/' || req.url === '/index.html') {
res.render(path.join(config.publishPath, req.url));
} else if (req.url === '/show.html') {
res.render(path.join(config.publishPath, req.url));
} else {
res.render(path.join(config.publishPath, req.url));
}
}
config.js
var path=require('path')
module.exports={
"port":9090,
"publishPath":path.join(__dirname, 'publish')
}
node.js的开发框架 express
express的特点:
1、实现了路由功能
2、中间件功能
3、对req和res对象的扩展
4、可以集成其他模板引擎
res.send()和res.end()的区别
express实现helloworld
var express=require('express');
var app=express();
app.get('/',function(req,res){
res.send("helloworld");
})
app.listen(9091,function(){
console.log("http://localhost:9092");
})
app.get与app.use
app.get的请求需要与路由规则严格匹配,而app.use只需要请求的根路径与路由规则匹配
app.all
请求方式不确定,请求路径需要与路由规则严格匹配
实现服务器
index.js
var express=require('express');
var path=require('path');
var router=require('./router.js')
var app=express();
app.use('/',router);
app.listen(9093,function(){
console.log("http://localhost:9091");
})
router.js
var express=require('express');
var path=require('path');
var handle=require('./handle.js')
var router=express.Router();
router.get('/index',function(req,res){
handle(req,res,'index.html');
});
router.get('/show',function(req,res){
handle(req,res,'show.html');
})
router.use('/resources',express.static(path.join(__dirname,'resources')));
module.exports=router;
handle.js
var path=require('path');
var fs=require('fs');
module.exports=function(req,res,name){
var filename=path.join(__dirname,'publish',name);
fs.readFile(filename, function(err, data) {
if (err) {
res.end('文件不存在');
} else {
res.end(data);
}
});
}