最近正在学习搭建一个nodejs服务器来执行脚本,通过执行脚本,进行业务上的一些简易配置。
网上查看后有好几种实现方式,这里我使用的是express来搭建服务器。
1.首先,我安装了淘宝镜像,
npm install cnpm -g –registry=https://registry.npm.taobao.org
2.全局安装express命令安装工具。
cnpm install -g express-generator
3.安装express框架
cnpm install -g express
4.新建项目:express myStudy -e
5.下载组件依赖:cnpm install
6.启动项目:npm start
至此,基本的项目环境已经搭建好了。
1.bin:用于应用启动,可在里面设置启动的端口号等。
2.public:里面用来存放静态资源目录。
3.routes:相当于后台的controller(控制器),路由。
4.views:jade模板目录,可以认为是view(视图)目录。
5.app.js:程序main入口文件。
6.package.json:工程配置的一些依赖,通过install安装下载依赖。
express通过请求的控制器名称来配对相应controller,在做相应的request和response处理等操作。
第一个参数path为请求路径,第二个参数为处理请求的回调函数
app.get(path, function(req, res))
get方法使用:
//跳转到views下的index.ejs视图
router.get('/', function(req, res, next) {
res.render('index', { title: '陈厚伯' });
});
//匹配htp://localhost:3000/hello做相关req,res的操作
router.get('/hello',function(req,res){
res.end('hello');
});
第一个参数path为请求路径,第二个参数为处理请求的回调函数和get一样
app.post(path,function(req,res))
post方法使用:
//匹配htp://localhost:3000/hello做相关req,res的操作
router.post('/hello', function (req,res) {
res.end('hello');
});
//匹配所有,主要用作not found
router.post('*', function (req,res) {
res.end('post没找到');
});
监听所有的请求方法,可以匹配所有的HTTP动词。根据请求路径来处理客户端发出的所有请求,参数同上
app.all(path,function(req, res))
all方法使用:
const express = require('express');
const app = express();
app.all('/world',function(req,res){
res.end('all world');
});
app.listen(3000);
在router路由容器中存放一层层route实例,并且每层route实例中存放一层层callback,当匹配上一个route的时候,执行它里面的callback
router.get('/user',function(req,res,next){
console.log(1);
next();
},function(req,res,next){
console.log(11);
next();
}).get('/world',function(req,res,next){
console.log(2);
next();
}).get('/hello',function(req,res,next){
console.log(3);
res.end('ok');
});
说明:
中间件就是处理HTTP请求的函数,用来完成不同的业务需求,如检查用户是否登录、检测用户是否有权限访问等。
特点:
主要通过use方法
var express = require('express');
var app = express();
app.use(function (req,res,next) {
console.log('全部匹配');
next();
});
app.use('/water', function (req,res,next) {
console.log('只匹配/water');
next();
});
app.get('/water', function (req,res) {
res.end('water');
});
app.listen(3000);
中间件原理:
通过Application原型上的use方法,将Router变函数,抽象出Router方法复用,可以用app下面的use方法调取中间件,也可以创建一个express.router,在通过app下面use调用这个中间件,形成一个父子级别的中间件路由,下面user.use就是当访问/user/或者/user/2的子路由
const express = require('../');
const app = express();
app.use(function(req,res,next){
console.log('Ware1:',Date.now());
next('wrong');
});
app.get('/',function(req,res,next){
res.end('1');
});
const user = express.Router();
user.use(function(req,res,next){
console.log('Ware2',Date.now());
next();
});
user.use('/2',function(req,res,next){
res.end('2');
});
app.use('/user',user);
app.use(function(err,req,res,next){
res.end('catch '+err);
});
app.listen(3000,function(){
console.log('server started at port 3000');
});
如果要在网页中加载静态文件(css、js、img),就需要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件
var express = require('express');
var app = express();
var path = require('path');
app.use(express.static(path.join(__dirname,'public')));
static属于express内置中间件,其中原理主要是调用了serve-static库,具体实现是原生node.js API,可以查看我写的一篇如何搭建静态服务器 static-server
这里主要说的是ejs模板,具体API文档可以查看 EJS官网
1.安装ejs
$ npm install ejs
2.设置模板
var express = require('express');
var path = require('path');
var app = express();
app.set('view engine','ejs');
app.set('views',path.join(__dirname,'views'));
3.渲染html
app.set('view engine','html'); app.set('views',path.join(__dirname,'views')); app.engine('html',require('ejs').__express);
4.渲染视图
//参数一,要渲染的模板,
//参数二,渲染模板所需要数据
app.get('/', function (req,res) {
res.render('hello',{title:'hello'},function(err,data){});
});
5.模板的实现
res.render = function (name, data) {
var viewEngine = engine.viewEngineList[engine.viewType];
if (viewEngine) {
viewEngine(path.join(engine.viewsPath, name + '.' + engine.viewType), data, function (err, data) {
if (err) {
res.status(500).sendHeader().send('view engine failure' + err);
} else {
res.status(200).contentType('text/html').sendHeader().send(data);
}
});
} else {
res.status(500).sendHeader().send('view engine failure');
}
}
``