簡單的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章