express简单搭建服务,mysql数据库查询
- 项目目录搭建:
- public存放公共资源;package.json通过npm init生成;src下:app.js是入口文件,搭建服务;config是路由配置文件,router是每一个路由文件,modules是查询数据库的操作;
- public存放公共资源;package.json通过npm init生成;src下:app.js是入口文件,搭建服务;config是路由配置文件,router是每一个路由文件,modules是查询数据库的操作;
- 贴上package.json文件
{ "name": "myserver", "version": "1.0.0", "description": "my server with project", "main": "./src/app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "babel -w src/ -d build/ --source-maps", "dev": "nodemon node build/app.js" }, // 做语法转换 "babel": { "presets": [ "es2015", "stage-0" ] }, "author": "", "license": "ISC", "devDependencies": { "babel-preset-es2015": "^6.24.1", "babel-preset-stage-0": "^6.24.1", "body-parser": "^1.18.3", "express": "^4.16.4", "mysql": "^2.16.0", "nodemon": "^1.18.6" } }
需要注意的是:如果用了babel,一定要去全局安装babel, babel-cli, babel-core三个包才可以
nodemon来持续重启项目工程
运行的时候需要先npm run build 来打包出来build文件夹,然后再npm run dev启动服务 - express搭建服务
// src/app.js import express from 'express' import path from 'path' import bodyParser from 'body-parser' import router from './config' const app = express() const staticPath = path.join(process.cwd(), 'public') app.use(express.static(staticPath)) app.use(bodyParser.urlencoded({extended: false})) app.use(bodyParser.json()) app.use('*', function (req, res, next) { res.header("Access-Control-Allow-Origin", "*") res.header("Access-Control-Allow-Headers", "*") next() }) router(app) app.listen(3002, function () { console.log(`http://localhost:3002`) })
引入express包listen监听端口,引入body-parser包解析post方式传递的参数,设置静态资源访问路径,设置允许访问的地址,引入路由
- config文件夹下新建index.js开放接口
考虑到放一起代码冗余,所以拆分开了,通过引入router文件夹下的对应文件来处理请求和响应// config/index.js import GetData from '../router/getData' export default function (app) { app.get('/api/getArticleList', GetData) }
- modules文件夹下新建index.js连接数据库
// 创建数据库连接 modules/index.js import mysql from 'mysql' let connect = mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', port: '3306', database: 'user' }) connect.connect() export default connect
- modules文件夹下新建router对应的文件来配置数据库查询
// modules/getData.js import connect from './index.js' const GetData = function (callback) { connect.query('select * from article_list', function(err, data) { if (err) { console.error(err) } callback(data) }) } export default GetData
- router文件夹下新建对应文件处理响应
// router/getData.js import express from 'express' import GetData from '../modules/getData.js' const router = express() router.get('/api/getArticleList', function(req, res) { GetData(function (data) { res.end(JSON.stringify(data)) }) }) export default router
部署到线上,并pm2守护
- window10本地部署到阿里云ECS服务CentOS7系统上。
- 本地scp命令上传到云服务,scp -r projectName/ root@URL :fileName
- 远端文件下载到本地的命令是:scp -r root@url:/root/projectName 本地路径
- fileName是云服务的路径。ls命令查看云服务的所有文件
- 上传成功之后,云服务全局下载babel所需的包和pm2。因为项目需要npm run build 和npm run dev同时执行,但是pm2做不到这一点,所以,我们用以下方式来实现:
- 在项目根目录新建build.json文件,内容如下:
- 然后pm2 start build.json 命令启动npm run build
- 接下来需要pm2 start build/app.js --watch 或者 直接 npm run dev 启动服务
- 最后,就可以尝试访问了
可能的问题
-
因为我的CentOS还是firewalld防火墙开启状态,并且正好3002端口我没有允许通过,所以刚开始是访问不到接口的
-
所以,先查看防火墙状态: systemctl status firewalld,如果是active,证明是启动状态
-
如果防火墙没启动,就启动防火墙:systemctl start firewalld
-
接着,查看所有已经启动的服务:systemctl list-unit-files|grep enabled
-
查看firewalld允许通过的端口列表:firewall-cmd --zone=public --list-ports
-
查看当前开了哪些端口,其实一个服务对应一个端口 firewall-cmd --list-services
-
发现我只开放了3306端口,接着我开放了3002端口 :firewall-cmd --zone=public --add-port=3002/tcp --permanent
-
之后需要重启防火墙:systemctl restart firewalld.service
-