前面的话:在这里已经提到了安装node的方法,node是自带npm的。我在技术中会用es6去编写,而后下面会分别介绍node、pm二、express、mysql、sequelize。有少部分是摘抄大佬的内容,若有侵权,联系必删。已更新。html
http://www.javashuo.com/article/p-tinbhllm-bw.html前端
下面会教你们怎么去搭建一个后台应用。vue
npm i //这个 i 是指install 安装 npm -g //这个 -g是指全局安装
NodeJs介绍node
套用官方的话就是:mysql
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 git
ps:其实nodejs几乎能实现任何的东西,可是没有世界上最好用的语言,只有合适不合适。es6
nodejs中文网:http://nodejs.cn/github
基于 Node.js 平台,快速、开放、极简的 Web 开发框架web
Express安装正则表达式
npm i -g express
安装的express版本是4.0的,如今直接输入express webtest,也会提示express不是内部命令,缘由是最新express4.0版本中将命令工具分家出来了,因此咱们还须要安装一个命令工具,命令以下:
npm i -g express-generator
express中文文档:http://www.expressjs.com.cn/4x/api.html
这里的话用的是ejs的模板去搭建,由于前端显示页面是作不分离的项目,可是后台管理的话是用vue全家桶去作,这里的后台搭建会在【vue三部曲】中的第二部讲到。
按照这个下面的命令去作就能够了
cd webtest //进入webtest文件夹 npm install //安装所需依赖
npm start //npm启动
express默认的端口是3000,在浏览器的地址栏打开http://127.0.0.1:3000/,成功以下图显示
express目录介绍
这里几个执行的方法就不介绍了
// 代表是node可执行文件 #!/usr/bin/env node // 引入上面导出的app实例 var app = require('../app'); // 引入debug模块,打印调试日志 var debug = require('debug')('blog:server'); var http = require('http'); // 设置端口号 var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); // 启动工程 var server = http.createServer(app); // 监听端口号 server.listen(port); server.on('error', onError); server.on('listening', onListening);
// 生成一个express实例app var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); var app = express(); // 设置views文件夹为存放视图文件的目录,即存放模板文件的地方 // dirname为全局变量,存储当前正在执行的脚本所在的目录 app.set('views', path.join(__dirname, 'views')); // 设置模板引擎为ejs app.set('view engine', 'ejs'); // 加载日志中间件 app.use(logger('dev')); // 加载解析json的中间件 app.use(bodyParser.json()); // 加载解析urlencoded请求体的中间件 app.use(bodyParser.urlencoded({ extended: false })); // 加载解析cookie的中间件 app.use(cookieParser()); // 设置public文件夹为存放静态文件的目录 app.use(express.static(path.join(__dirname, 'public'))); // 路由控制器 app.use('/', index); app.use('/users', users); // 捕获404错误,并转发到错误处理器 app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // 盛传环境下的错误处理器,将错误信息渲染error模板并显示到浏览器中 app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; // 开发环境下的错误处理器,将错误信息渲染error模板并显示到浏览器中 res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); // 导出app实例,供其余模块调用 module.exports = app;
// 生成一个路由实例用来捕获访问主页的GET请求,导出整个路由并在app.js中经过app.use('/',routes);加载。 // 这样,当访问主页时,就会调用res.render('index',{title:'Express'});渲染views/index.ejs模板并显示到浏览器中 var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) {//首页路由 res.render('index', { title: 'Express' });//render views视图目录下的index.ejs模板 }); // 导出路由实例 module.exports = router;
express安装好以后,该安装pm2了,刚刚那个npm start确定后面不会用的。这个命令能够在packge.json中看到是npm启动的方式,启动了bin/www这个文件。不用这个命令去启动是由于,须要启动窗口一直开着,并且没有热更新,写完代码保存以后不会实施更新。好了,如今的话安装全局的pm2
pm2介绍
• 内建负载均衡(使用 Node cluster 集群模块)
• 后台运行 。
• 0 秒停机重载,维护升级的时候不须要停机。
• 具备 Ubuntu 和 CentOS 的启动脚本 。
• 中止不稳定的进程(避免无限循环)
• 控制台检测
• 提供 HTTP API
• 远程控制和实时的接口 API ( Nodejs 模块,容许和 PM2 进程管理器交互 )
npm官网的pm2包:https://www.npmjs.com/package/pm2
npm i pm2 -g
pm2经常使用参数
-watch //监听应用目录变化,一旦发生变化,自动重启。 -i -instances //启动多少个实例,可用于负载均衡,若是-i 0或 -i max,则根据当前机器核数来肯定实例数目。 -ignore-watch//排查监听目录/文件,能够是特定文件名,也能够是正则。 -n -name//应用的名字,查看应用信息。 -o -output//标准输出日志文件路径 -e -error//错误日志文件输出
pm2经常使用命令
pm2 list //列出pm2中的全部程序 pm2 logs //列出当前全部程序的web的日志,能够带项目的id或者name,显示指定程序的日志 pm2 start bin\www //pm2启动bin/www这个文件 pm2 stop 0//中止id为0的程序,这里不必定要用id也能够是项目名称name,而后能够带一个all中止所有程序 pm2 delete 0//删除id为0的程序,是删除在pm2中运行的程序,同理这里不必定要用id也能够是项目名称name,能够带一个all删除所有程序 pm2 reload 0 //重启id为0的程序,同理这里不必定要用id也能够是项目名称name,能够带一个all重启全部程序 pm2 startup //建立开机自启动命令
在这里说明一下,我通常喜欢使用
pm2 start bin\www --name=webtest --watch //--name是能够重命名程序显示的名字 //--watch是实时预览程序 //这一段代码比较长,能够把他放在package.json中的scripts中,用npm启动的方式去启动pm2程序
好了基本工具已经介绍完了。如今开始启动嗨起来,对了还有一个 sequelize,一样的安装方式
squelize安装
npm i sequelize //安装以后引入使用可能会报mysql2的错,注意这里有个2,因此须要安装mysql2 npm i mysql2
squelize介绍
Sequelize是一个基于promise的关系型数据库ORM框架,这个库彻底采用JavaScript开发而且可以用在Node.JS环境中,易于使用,支持多SQL方言(dialect),。它当前支持MySQL,、MariaDB、SQLite、PostgreSQL、Sql Server 数据库。
目前在Node.js中,Sequelize的关注度较高,用的也较多。
由于是基于promise规范,在调用后的处理上再也不是callback方式,而是统一的链式调用方式,调用直观,易读。
开始
先把项目跑起来。
为了方便,能够建公共的头部和底部使用include的方式把公共部分引入进来
而后效果就是这样啦
建立其余的路由页面
如下是官方的一些路由实例
如下是基于字符串的路径路径的一些示例。 此路由路径将匹配对根路由的请求,/。 app.get('/', function (req, res) { res.send('root') }) 此路径路径将匹配请求/about。 app.get('/about', function (req, res) { res.send('about') }) 此路径路径将匹配请求/random.text。 app.get('/random.text', function (req, res) { res.send('random.text') }) 如下是基于字符串模式的路径路径的一些示例。 此路径路径将匹配acd和abcd。 app.get('/ab?cd', function (req, res) { res.send('ab?cd') }) 这条路线的路径将会匹配abcd,abbcd,abbbcd,等等。 app.get('/ab+cd', function (req, res) { res.send('ab+cd') }) 这条路线的路径将会匹配abcd,abxcd,abRANDOMcd,ab123cd,等。 app.get('/ab*cd', function (req, res) { res.send('ab*cd') }) 此路径路径将匹配/abe和/abcde。 app.get('/ab(cd)?e', function (req, res) { res.send('ab(cd)?e') }) 基于正则表达式的路径路径示例: 此路径路径将匹配其中包含“a”的任何内容。 app.get(/a/, function (req, res) { res.send('/a/') }) 这条路线的路径将匹配butterfly和dragonfly,但不butterflyman,dragonflyman等。 app.get(/.*fly$/, function (req, res) { res.send('/.*fly$/') })
这个是express的地址:http://www.expressjs.com.cn/guide/routing.html
咱们都知道全部能访问的页面都是get请求,因此通常用于seo前端渲染的模板上都是经过get路由去访问的。
express写接口
在这里的话须要先安装mysql数据库了。能够去mysql官网下一个mysql环境,个人系统是win10 64的,因此的根据本身的系统和须要的mysql版本下载安装。这里有点尴尬,我忘了我是怎么装的了。。。你们能够搜一下win10安装mysql的教程,仍是挺多的。
进入地址:https://dev.mysql.com/downloads/mysql/ 下载mysql-8.0.11-winx64
安装好后控制台输入
mysqll -u root -p //回车而后输入密码就能够了,须要注意的是,每次须要执行的mysql语句是要在结尾加上分号的。
或者你们也可使用可视化工具,这里推荐的是Navicat for MySQL用着仍是很舒服的,不过新手的话建议仍是须要熟悉一下mysql语句的,好比我这种菜鸡。
菜鸟教程的mysql教程:http://www.runoob.com/mysql/mysql-tutorial.html
show databases; //显示全部数据库 create database webtest;//建立名为webtest的数据库 use webtest;//选中webtest的数据库
好吧。我以为我仍是须要一个工具
新建一个表,里面暂时是没有数据的。能够经过后面给出的方法作一个套增删该查
下面是续更。。。
知识点:JS的模块化
在写nodejs操做数据库以前,须要了解一些知识点。好比:js模块化,而属于js模块化的标准有3个(CommonJS,AMD,CMD)
CommonJS
浏览器不兼容CommonJS的根本缘由,在于缺乏四个Node.js环境的变量。
AMD
最先的时候,全部的文件都是写在一个js里面,可是后面代码越写越多,而后就把代码拆分出来不一样的js。而这样在浏览器去请求资源的时候,容易形成阻塞,因此诞生了require.js。require.js要求,每一个模块是一个单独的js文件。这样的话,若是加载多个模块,就会发出屡次HTTP请求,会影响网页的加载速度。所以,require.js提供了一个https://requirejs.org/docs/optimization.html,当模块部署完毕之后,能够用这个工具将多个模块合并在一个文件中,减小HTTP请求数。
CMD
玉伯是seajs的创始人,和AMD挺相近的。在 Sea.js 中,全部 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范。该规范明确了模块的基本书写格式和基本交互规则。在 CMD 规范中,一个模块就是一个文件。
AMD和cmd的区别在于:SeaJS对模块的态度是懒执行, 而RequireJS对模块的态度是预执行。https://github.com/seajs/seajs/issues/277#issuecomment-19736961
题外话:我以为我电脑要炸了。。。电脑好卡,下个sublimetext3继续更。不知道为何下载sublimetext3好慢,以前1秒钟就下完了,如今几十分钟过去了。。还没下好,只能继续用vscode更了。。
好了。。步入正题。
先建立这2个文件夹 lib 和 module 。lib主要放一些配置文件,module主要放模块化的文件。
先看一下数据库,这里就不搞那么复杂了
数据库配置信息 lib\db.js(database.js)
1 const Sequelize = require('sequelize');//引入sequelize依赖 2 3 const mysql = {//本地mysql库信息配置 4 host: 'localhost',//地址 5 user: 'root',//用户名 6 password: '1234',//密码 7 database: 'webtest',//数据库名 8 dialect: 'mysql'//数据库类型 9 }; 10 11 const db = new Sequelize(mysql.database, mysql.user, mysql.password, { 12 host: mysql.host, 13 dialect: mysql.dialect, 14 operatorsAliases: false, 15 pool: { 16 max: 5,//最大链接池 17 min: 0, 18 idle: 10000 19 } 20 });//建立链接件程序 21 22 db.authenticate().then(function() { 23 console.log("数据库链接成功"); 24 }).catch(function(err) { 25 //数据库链接失败时打印输出 26 console.error(err); 27 throw err; 28 }); 29 30 module.exports = db;//导出
经过下面这段代码测试是否链接成功。经过cd到这个lib目录下,经过命令行node db.js去测试。
而后经过db.js去建立一个User的对象,sequelize的一些方法能够看看中文文档:https://itbilu.com/nodejs/npm/VkYIaRPz-.html
const sequelize = require('sequelize'); const db = require('../lib/db');//引入数据库配置信息 const User = db.define('info', {//建立一个User对象,info是表名 id: { field: 'id',//对应数据库的名字 primaryKey: true,//自增 type: sequelize.INTEGER,//类型 }, username: { field: 'username', type: sequelize.STRING(16), }, password: { field: 'password', type: sequelize.STRING(16), } },{ tableName: 'info',//表名 timestamps: true,//默认状况下,Sequelize会将createdAt和updatedAt的属性添加到模型中,以便您能够知道数据库条目什么时候进入数据库以及什么时候被更新。请注意,若是您使用Sequelize迁移,则须要将createdAt和updatedAt字段添加到迁移定义中 freezeTableName: true// 默认false修改表名为复数,true不修改表名,与数据库表名同步 }); module.exports = User;
目前的话就先到这里啦,各位晚安。。由于加班因此更新的会比较晚。。明天把前端ejs渲染的知识点和接口写出来。。晚上cpu莫名的由于VS code飙升,更新今天的内容花了一个半小时。
各位新年快乐,过年期间发生了挺多事情的,今天开始继续更啦。