1、ejs:

const ejs = require('ejs')

ejs.renderFile('./template/a.ejs', {name:'cc'}, function (err, data) {
console.log(data)
})
//第二个参数是数据 <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<%= name%>
</body> </html>

输出变量的语法

<%= variable %>

<%= obj.a%>

<%= 1+4%>

循环语法:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<% for(let i=0;i<15;i++) {%>
<div>这是第<%= i%>个</div>
<% }%>
</body> </html>

输出html:

使用-

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<% var str="<div>你好呀</div>"%>
<%- str%>
</body> </html>

ejs编译后输出undefined表示编译发生错误

ejs引用语法;

const ejs = require('ejs')

ejs.renderFile('./template/a.ejs', {name:'cc'}, function (err, data) {
console.log(data)
})
//第二个参数是数据

分支语法

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<% let a=8%>
<% if(a>0){%>
<h1>a>0</h1>
<%else{%>
<h1>a<=0</h1>
<%}%> </body> </html>

include 不能接变量,请直接接路径

2、express结合模板引擎使用

1)实现服务器

//一个简单的服务器
const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const ejs = require('ejs')
//构建服务器
let server = express()
//服务器监听
server.listen(8080, function () {
console.log('server is running')
})
//解析cookie
server.use(cp('abc321'))//秘钥
//使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys:keys,
maxAge: 30 * 3600 * 1000
}))
//处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式
//用户请求
server.use('/', function (req, res, next) {
//打印get,post
console.log(req.query,req.body,req.cookies,req.session)
})
//处理静态请求
server.use(static('./www'))

2、服务器处理post请求中的文件上传

bodyparser并不完全适用于处理post请求,因为它只能处理数据而不能处理文件

普通的post表单不能上传文件,需指定其enctype属性

input表单enctype属性,有3个值

"application/x-www-form-urlencoded" 即 键值对
“multipart/form-data”上传表单数据
“text/plain” 上传纯文本
 
这时我们改用multer中间件
 
path模块的parse方法:
const path =require('path')
let obj=path.parse(str)
//.base 文件名,包含扩展名
//.ext 扩展名
//.dir 文件所在目录
//.name:文件名部分,不包括扩展名
const express = require('express')
const mr = require('multer')
const fs = require('fs')
const path = require('path')//帮助解析文件路径 let server = express() let multer = mr({ dest: './www/upload' })//声明一个multer对象
//dest指定文件上传后保存的位置,自动为您编辑文件名 server.use(multer.any()) //single方法接收指定名称的文件
//.any()接收任意文件 server.post('/', function (req, res) {
console.log(req.files)//files数组存储用户上传的文件
//为用户上传的文件添加相同的扩展名
//用到了方法:fs.rename('旧文件完整路径','新文件完整路径') let newName=req.files[0].path+path.parse(req.files[0].originalname).ext
fs.rename(req.files[0].path,newName,function(err){
if(!err) res.send('上传成功')
else res.send('上传失败')
})
})
server.listen(8080, function () {
console.log('server is runnning')
})
const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const ejs = require('ejs')
const multer=require('multer') //构建服务器
let server = express() //服务器监听
server.listen(8080, function () {
console.log('server is running')
}) //解析cookie
server.use(cp('abc321'))//秘钥 //使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys:keys,
maxAge: 30 * 3600 * 1000
})) //处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式,解析url数据
server.use(multer({dest:'./www/upload'}).any()) //用户请求
server.use('/', function (req, res, next) {
//打印get,post
console.log(req.query,req.body,req.files,req.cookies,req.session) }) //处理静态请求
server.use(static('./www'))

3、结合模板引擎完成服务器

1)consolidate

帮助express整合各种不同的模板引擎

const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const multer = require('multer')
const ce = require('consolidate') //构建服务器
let server = express() //服务器监听
server.listen(8080, function () {
console.log('server is running')
}) //解析cookie
server.use(cp('abc321'))//秘钥 //使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys: keys,
maxAge: 30 * 3600 * 1000
})) //处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式,解析url数据
server.use(multer({ dest: './www/upload' }).any()) //配置模板引擎
server.set('view engine','html')//修改server全局配置,修改视图引擎为html
//确认模板位置
server.set('views','./views')
//确认所使用的模板引擎
server.engine('html',ce.ejs) //用户请求
// server.use('/', function (req, res, next) {
// //打印get,post
// console.log(req.query, req.body, req.files, req.cookies, req.session) // }) //接收用户请求
server.get('/index',function(req,res){
// if(req.session.userid){
//指定模板名称
res.render('a.ejs',{name:'cc'})
// }else{
// res.render('login.ejs',{})
// }
}) //处理静态请求
server.use(static('./www'))
 
2、路由:
express自带路由功能
const express=require('express')

let server=express()

let routerUser=express.Router()//用户模块

server.use('/user',routerUser) //确认路由对应关系

//进行路由分发
routerUser.get('/a.html',function(req,res){
res.send('a.html')
}) routerUser.get('/b.html',function(req,res){
res.send('b.html')
}) let routerNews=express.Router()//新闻模块 server.use('/news',routerNews) //确认路由对应关系 routerNews.get('/c.html',function(req,res){
res.send('c.html')
}) routerNews.get('/d.html',function(req,res){
res.send('d.html')
}) server.listen(8080)

router相当于迷你版的server

 

node05的更多相关文章

  1. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  2. spark HA 安装配置和使用(spark1.2-cdh5.3)

    安装环境如下: 操作系统:CentOs 6.6 Hadoop 版本:CDH-5.3.0 Spark 版本:1.2 集群5个节点 node01~05 node01~03 为worker. node04. ...

  3. yarn.resourcemanager.ha.id设置

    resourcemanager启动报错,其中一个启动成功,另一个启动报8088端口被成功启动的rm占用 2016-11-18 17:08:49,478 INFO org.apache.zookeepe ...

  4. nodemanager启动失败

    yarn启动报错: 2016-11-16 16:12:44,304 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping N ...

  5. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. ansible安装(批量执行命令

    rpm安装 下载epl源 :  Download the latest epel-release rpm from:http://dl.fedoraproject.org/pub/epel/6/x86 ...

  7. hive 未初始化元数据库报错

    启动hive-metastore和hive-server2 用beeline连接hive报错 [root@node04 hive]# beeline Beeline version 0.13.1-cd ...

  8. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  9. CentOS 7 配置静态IP后不生效 & Job for network.service failed

    参考:http://tieba.baidu.com/p/3233996339#57290767555l 在CentOS中配置静态IP后不生效. 解决办法:将/etc/sysconfig/network ...

随机推荐

  1. Excel 将A表的基础数据拼接到B表中来-三种方法: ctrl+回车, VLOOKUP()函数,宏

    A表  基础信息表 B表 业务信息表 将a表中的基础数据 拼接到B表的后面, 应用场景是: B表很多数据,很繁乱,名字不一定全, A表也是比较多的行,B表乱:比如有8行有李晨的,却只有3行是范仲淹的, ...

  2. CentOS搭建GIT服务器

    安装git # 请确保您切换到了root账户 $ su root $ yum install -y git # 验证是否安装成功 $ git --version # 输出如下内容表示成功: git v ...

  3. L2-004 这是二叉搜索树吗? (25 分) (树)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题目: 一棵二叉搜索树可被递归地定义为 ...

  4. GitLab实战操作指南

    一.Git原理 1.Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). 2.Git有什么特点? 简单来说就是:高端大气上档次! 3.GIt与SVN区别 SVN管理: 属于集中式 ...

  5. 关于form-checkbox 必填项无效的错误

    校验规则要写在一个form里 检查data,给个默认值. 否则刚进去错误提示不显示. 其次,要加 type 类型,注意大小写 触发类型为 change .

  6. 2、阿里云ECS发送邮件到腾讯企业邮箱(ECS默认不开启25端口)

    阿里云ECS默认禁用25端口导致发邮件失败. 方法一: 使用shell脚本发送邮件,需要配置mailx 1.安装软件 yum install mailx 2.配置 vim /etc/mail.rc在文 ...

  7. windows 上传文件到 Linux 服务器

    方法一: pscp E:\javaWP\new11111.txt username@130.75.7.156:/home/

  8. css背景图片充满DIV

    最近接手前端页面,让给调样式.哥纯粹一个代码程序猿,表示那些个样式应该让前端人员或者美工小妹妹来实现. 书归正传,碰到了问题,页面要在手机上展现,众所周知,手机在中国的牌子很多,很难做到统一. 页面上 ...

  9. python3+Robot Framework+PyCharm第一个WEB UI自动化用例

    这里只是列举一个很简单的例子,简单介绍工具的使用,编写用例之前,做好WEB UI自动化的准备工作,下载好chrome驱动(这里以chrome为例,不同浏览器有对应的驱动),注意驱动和浏览器版本要对应, ...

  10. Angular 自定义拖拽指令

    指令 组件是一种带模版的指令.指令是超级. 结构型指令(改变布局)和属性型指令(改变外观和行为). Renderer2和ElementRef Angular不提倡直接操作DOM 对于DOM的操作应该通 ...