简单的express服务上线到ECS云服务器,pm2守护

express简单搭建服务,mysql数据库查询

  1. 项目目录搭建:
    1. public存放公共资源;package.json通过npm init生成;src下:app.js是入口文件,搭建服务;config是路由配置文件,router是每一个路由文件,modules是查询数据库的操作;
  2. 贴上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启动服务

  3. 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方式传递的参数,设置静态资源访问路径,设置允许访问的地址,引入路由

  4. config文件夹下新建index.js开放接口
    // config/index.js
    import GetData from '../router/getData'
    
    export default function (app) {
      app.get('/api/getArticleList', GetData)
    }
    
    考虑到放一起代码冗余,所以拆分开了,通过引入router文件夹下的对应文件来处理请求和响应
  5. 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
    

    创建数据库连接

  6. 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
    
  7. 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守护

  1. window10本地部署到阿里云ECS服务CentOS7系统上。
    1. 本地scp命令上传到云服务,scp -r projectName/ root@URL :fileName
    2. 远端文件下载到本地的命令是:scp -r root@url:/root/projectName 本地路径
    3. fileName是云服务的路径。ls命令查看云服务的所有文件
  2. 上传成功之后,云服务全局下载babel所需的包和pm2。因为项目需要npm run build 和npm run dev同时执行,但是pm2做不到这一点,所以,我们用以下方式来实现:
  3. 在项目根目录新建build.json文件,内容如下:
  4. 然后pm2 start build.json  命令启动npm  run build
  5. 接下来需要pm2 start build/app.js --watch 或者 直接 npm run dev 启动服务
  6. 最后,就可以尝试访问了

可能的问题

  1. 因为我的CentOS还是firewalld防火墙开启状态,并且正好3002端口我没有允许通过,所以刚开始是访问不到接口的

    1. 所以,先查看防火墙状态: systemctl status firewalld,如果是active,证明是启动状态

    2. 如果防火墙没启动,就启动防火墙:systemctl start firewalld

    3. 接着,查看所有已经启动的服务:systemctl list-unit-files|grep enabled

    4. 查看firewalld允许通过的端口列表:firewall-cmd --zone=public --list-ports

    5. 查看当前开了哪些端口,其实一个服务对应一个端口 firewall-cmd --list-services

    6. 发现我只开放了3306端口,接着我开放了3002端口 :firewall-cmd --zone=public --add-port=3002/tcp --permanent

    7. 之后需要重启防火墙:systemctl restart firewalld.service

发布了24 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43869192/article/details/85274849
今日推荐