所以,将界面和逻辑分开
注册这一步其实就是将定义好的模板引擎配置到app中 5.1.加载模板 5.2.配置应用模板 还可以传递第二个参数,传递给模板使用的数据 在views里面新建index.html 原理:app应用在读取模板的时候第一次读取模板文件(index.html)以后并且把它解析后保存在内存中,下一次再次访问的时候,同样的路径解析同样的模板就不会在文件当中读取解析的,而是从已经存在于内存当中的数据中直接读取然后返回。所以重启应用。但是在实际工作中,常常会不断的修改模板,那么就需要不断的重启服务,很麻烦。 在开发过程中,需要取消模板缓存 //在开发过程中需要取消模板缓存 swig.setDefaults({cache: false});这样,每次就不需要重新去运行app.js,而是保存模板文件即可。
6.静态文件托管 写模板文件的时候经常会引入外部文件,如图片,css等。 那么头部需要去解析css文件。同时,在后端(app.js)中要写css 但是如果有多个css的话就会写很多get请求,很麻烦。 我们要请求的css和js是静态文件,不需要用这种动态的方法,只需要在后端获取,然后向前端发送。 当用户访问的url以/public开始,那么直接返回对应__dirname+'/public'下的文件 梳理一下这个过程: 用户发送http请求->url->解析路由->找到匹配的规则->执行指定的绑定函数,返回对应内容至用户 在public中新建main.css文件 // app.js /** * Created by xiaofeng on 2017/5/1 0001. */ /* * 应用程序的启动(入口)文件 * */ // 加载express模板 var express=require('express'); //创建app应用 => NodeJS Http.createServer(); var app=express(); // 加载模板引擎 var swig=require('swig'); // 设置静态文件托管 // 当用户访问的url以/public开始,那么直接返回对应_dirname+'/public'下的文件 app.use('/public',express.static(__dirname+'/public')); /* * 处理请求输出 * */ /* * 首页 * req request对象 * res response对象 * next函数 * */ // app.get('/',function (req,res,next) { // // res.send('<h1>欢迎来到我的Blog,这是通过NodeJS搭建的</h1>'); // }); /* * 配置应用模板 * 定义当前应用所使用的模板引擎 * 第一个参数:模板名称,也是文件后缀名,第二个参数用于解析处理模板的内容的方法 * */ app.engine('html',swig.renderFile); // 设置模板文件存放的目录,第一个参数必须是views,第二个参数是目录 app.set('views','./views'); // 注册所使用的模板引擎,第一个参数必须的view engine,第二个参数必须和app.engine这个方法中定义的模板名称一致 app.set('view engine','html'); swig.setDefaults({cache:false}); app.get('/',function (req,res,next) { res.render('index'); }); // 比较麻烦 // app.get('/main.css',function (req,res,next) { // res.setHeader('content-type','text/css'); // res.send("h1 {text-align:center;}"); // }); // 监听端口 http请求 app.listen(8081);接下来需要获取前端提交过来的post数据,如何获取?
需要用到一个第三方模块body-parser,用来处理post提交过来的数据 app.js // app.js /* * 应用程序的启动(入口)文件 * */ //加载express模板 var express=require('express'); //加载模板引擎 var swig=require('swig'); //加载数据库 var mongoose=require('mongoose'); //加载body-parser解析post数据 var bodyParser=require('body-parser'); //创建app应用 => NodeJS Http.createServer(); var app=express(); //设置静态文件托管 //当用户访问的url以/public开始,那么直接返回对应_dirname+'/public'下的文件 app.use('/public',express.static(__dirname+'/public')); /* * 配置应用模板 * 定义当前应用所使用的模板引擎 * 第一个参数:模板名称,也是文件后缀名,第二个参数用于解析处理模板的内容的方法 * */ app.engine('html',swig.renderFile); //设置模板文件存放的目录,第一个参数必须是views,第二个参数是目录 app.set('views','./views'); //注册所使用的模板引擎,第一个参数必须的view engine,第二个参数必须和app.engine这个方法中定义的模板名称一致 app.set('view engine','html'); swig.setDefaults({cache:false}); //body-parser设置 app.use(bodyParser.urlencoded({extended:true})); app.use('/admin',require('./routers/admin')); app.use('/api',require('./routers/api')); app.use('/',require('./routers/main')); //监听端口 http请求 mongoose.connect('mongodb://localhost:27017/blog',function (err) { if (err){ console.log('数据库连接失败'); }else { console.log('数据库连接成功'); app.listen(8081); } }); api.js var express=require('express'); var router=express.Router(); /* * 用户注册 * 这里router(路由)使用的方法要和index中ajax type属性一致,否则会报错 * */ router.post('/user/register',function (req,res,next) { //res.send('register'); console.log(req.body); }); module.exports=router;点击“注册”后,
用户注册: 注册逻辑的简单实现 var express = require('express'); var router = express.Router(); //统一返回格式 var responseData; router.use(function (req,res,next) { responseData = { code: 0, message: '' } next(); }); /* * 用户注册 * 注册逻辑:对字符进行验证,并且返回给前端 * 1.用户名不能为空 * 2.密码不能为空 * 3.两次输入的密码必须一致 * * 1.用户已经被注册 * 数据库中进行查询 * * 这里router(路由)使用的方法要和index中ajax type属性一致,否则会报错 * * */ router.post('/user/register', function (req, res, next) { var username = req.body.username; var password = req.body.password; var repassword = req.body.repassword; //用户名是否为空 if (username == '') { responseData.code = 1; responseData.message = "用户名不能为空"; res.json(responseData); return; } //密码不能为空 if (password == '') { responseData.code = 2; responseData.message = "密码不能为空"; res.json(responseData); return; } if (password != repassword) { responseData.code = 3; responseData.message = "两次输入密码不一致"; res.json(responseData); return; } responseData.message="注册成功"; res.json(responseData); }); module.exports = router;重启app.js进行测试
