摘要
通过前端三年开发经验,结合项目经验和积累,初步尝试运用Node.js+Express+MySQL搭建一套服务器,从而扩展一下后端知识以及巩固前端框架的运用,学而不尽做个笔记证明自己曾经学过且开发过,为朴素的简历增添一道亮点。
技术栈
- 框架:express基于Node.js平台,快速、开放、极简的Web开发框架
- 数据库:mysql
项目搭建步骤
1. 初始化项目(生成package.json文件)详细步骤可预览官方文档:www.expressjs.com.cn
$ npm init
2. 安装依赖模块
$ npm install express --save
$ npm install -g express-generator
$ express -e
$ npm install
$ env:DEBUG='myapp:*'; npm start
3. 生成的目录结构以及运行成功后在浏览器访问http://localhost:3000 就证明项目的搭建基本成功。
热更新
为了项目开发过程中为了提高开发效率可以安装依赖nodemon。
- 安装依赖。
- 在项目根目录下新建nodemon.json文件。
- 在项目根目录下修改package.json文件启动命令添加脚本。
1.安装
$ npm install --save-dev nodemon
2.nodemon.json文件
{
"ignore": [
".git",
"node_modules/**/node_modules",
"package-lock.json",
]
}
3.package.json文件
"scripts": {
"start": "nodemon node ./bin/www"
}
生成日志文件
便于项目打印日志定位代码可以安装依赖winston。
- 安装依赖。
- 在项目根目录新建logger.js文件。
- 修改app.js文件配置。
- 访问不存在的路由,在log/results.log下的文件查看打印日志。
1.安装
$ npm install --save-dev winston
2.logger.js文件
const { createLogger, format, transports } = require('winston');
const fs = require('fs');
const path = require('path');
const env = process.env.NODE_ENV || 'development';
const logDir = 'log';
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}
const filename = path.join(logDir, 'results.log');
const logger = createLogger({
level: env === 'production' ? 'info' : 'debug',
format: format.combine(
format.label({ label: path.basename(process.mainModule.filename) }),
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' })
),
transports: [
new transports.Console({
format: format.combine(
format.colorize(),
format.printf(
info =>
`${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
)
)
}),
new transports.File({
filename,
format: format.combine(
format.printf(
info =>
`${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
)
)
})
]
});
module.exports = logger;
3.app.js文件
// const logger = require('margan)
const morgan = require('morgan')
const logger = require('./logger')
// app.use(logger('dev'))
app.use(morgan('dev'))
修改error handler
app.use(function(err, req, res, next){
logger.error(`${req.method} ${req.originalUrl}` + err.message)
const errorMsg = err.message
res.status(err.status || 500).json({
code: -1,
success: false,
message: errorMsg,
data: {}
})
})
安装Docker
安装Docker在电脑上:download.docker.com 安装完成后打开Docker窗口,然后新建文件Dockerfile和index.html。
Dockerfile文件
FROM nginx
COPY ./index.html /user/share/nginx/html/index.html
EXPOSE 80
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello Word</title>
</head>
<body>
<h1>Hello Word!!!!</h1>
<h1>我成功啦!!!</h1>
</body>
</html>
- 当前目录打开PowerShell,根据Dockerfile文件创建镜像:
- 再根据镜像创建容器
- 再运行容器
- 最后打开浏览器访问127.0.0.1:2333,便能成功的访问到index文件内容
docker image build ./ -t hello:1.0.0
docker container create -p 2333:80 hello:1.0.0
docker container start xxx // xxx为创建容器后得到的结果
Docker部署mysql
- 拉取mysql镜像,查看所有镜像列表
- 根据mysql镜像创建容器,并且启动容器
- 查看mysql容器是否运行,进入docker本地连接mysql客户端
- 创建一个用户,再授权用户为超级管理用户
- 新建数据库,并查看数据库是否新建成功
- 使用新建的数据库再新建user_info表,并查看用户表是否新建成功
// 拉取镜像
docker pull mysql:5.7
docker images
// 创建容器
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker container ls
// 进入docker本地连接mysql客户端
docker exec -it mysql bash
bash-4.2# mysql -u root -p
Enter password: xxx // 输入密码
// 执行sql语句创建用户、授权、建表
mysql> SHOW DATABASES; //mysql语句结尾记得加;
mysql> CREATE USER 'admin'@'%' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
mysql> CREATE DATABASE expressFrame;
mysql> SHOW DATABASES;
mysql> USE expressFrame;
mysql> CREATE TABLE user_info (id int(10), name varchar(255), tel int(255));
mysql> SHOW TABLES;
连接数据库
- 安装mysql插件
npm install --save-dev mysql
- 新建connect.js添加初始化配置信息和sql.js文件存放mysql语句
connect.js文件:
const mysql = require('mysql')
const pool = mysql.createPool({
host: 'localhost', // 主机名
port: '3306', // 数据库的端口号
user: 'admin', // 用户名
password: '123456', // 密码
database: 'expressFrame' // 数据库名
})
module.exports = pool
sql.js文件
const SQL = {
getUserInfo: 'select * from user_info'
}
module.exports = SQL
- 新建userinfo.js路由文件,通过路由匹配连接数据库查询数据库数据返回客户端
var express = require('express');
var router = express.Router();
const pool = require('../mysql/connect')
const sql = require('../mysql/sql')
/* GET users listing. */
router.get('/api/userinfo', function(req, res, next) {
pool.getConnection(function(err, conn) {
if(err) { throw err }
conn.query(sql.getUserInfo, function(error, result, fields) {
conn.release()
let apiRes = {
code: 0,
message: '成功',
data: result
}
res.send(apiRes)
})
})
});
module.exports = router;
- 再app.js文件引入userinfo.js文件且运行项目
var userInfoRouter = require('./routes/userinfo');
app.use(userInfoRouter);
- 运行成功后在浏览器访问http://localhost:3000/api/userinfo 就能成功的获取数据库信息
结束
基于Node.js+Express+MySQL搭建步骤基本完成,但用户实际的开发还有很多细节和功能还要完善,需要深入的研究和学习更多的插件结合业务逻辑才能完成一个完成的小型项目,附上源码记录完整过程!