搭建nodejs+express服务器

本文详细介绍了如何使用Express搭建一个Node.js服务器,包括环境搭建、目录结构理解、路由控制、中间件使用、静态文件服务以及模板解析。通过实例展示了GET、POST、ALL方法的使用,以及如何设置静态资源目录和使用EJS模板引擎进行视图渲染。同时,还探讨了中间件的工作原理和应用场景。
摘要由CSDN通过智能技术生成

最近正在学习搭建一个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.了解环境目录

在这里插入图片描述

1.bin:用于应用启动,可在里面设置启动的端口号等。
2.public:里面用来存放静态资源目录。
3.routes:相当于后台的controller(控制器),路由。
4.views:jade模板目录,可以认为是view(视图)目录。
5.app.js:程序main入口文件。
6.package.json:工程配置的一些依赖,通过install安装下载依赖。

二.Express使用技巧

1.路由控制

express通过请求的控制器名称来配对相应controller,在做相应的request和response处理等操作。

a.get方法使用

第一个参数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');
});
b. post方法使用

第一个参数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没找到');
});
c. all方法使用

监听所有的请求方法,可以匹配所有的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);
d. Express Router的设计

在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');
});

2.中间件

说明
中间件就是处理HTTP请求的函数,用来完成不同的业务需求,如检查用户是否登录、检测用户是否有权限访问等。

特点

  1. 一个中间件处理完请求和响应可以把相应数据再传递给下一个中间件
  2. 回调函数的next参数,表示接受其他中间件的调用,函数体中的next(),表示将请求数据继续传递
  3. 可以根据路径来区分返回执行不同的中间件
使用

主要通过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');
});

3.静态服务文件

如果要在网页中加载静态文件(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

4. 模板解析

这里主要说的是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');
    }
}
``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值