美文网首页
nodejs+Koa2实际项目中遇见的问题

nodejs+Koa2实际项目中遇见的问题

作者: wayne1125 | 来源:发表于2019-12-25 22:49 被阅读0次
    • 记得刚开始用nodejs写接口服务时,那时候服务是基于nodejs+express+mysql搭建的,直到前段时间需要提供部分CRM系统接口功能,这次选择nodejs+koa2+sequelize+mysql搭建的项目,线上部署都是采用pm2进程守护部署
    • 以下是在实际发布上线时遇见的各种坑,总结如下:


      项目目录
    1、pm2配置文件——服务不定时挂掉

    pm2配置

    {
     "apps": [
      {
       "name": "management-server",
       "script": "bin/www",
       "log_date_format": "YYYY-MM-DD HH:mm:SS",
       "log_file": "logs/node.log",
       "error_file": "logs/node-err.log",
       "out_file": "logs/node-out.log",
       "pid_file": "pids/node.pid",
       "instances": 1,
       "min_uptime": "200s",
       "max_restarts": 30,
       "max_memory_restart": "10M",
       "cron_restart": "1 0 * * *",
       "watch": false,
       "merge_logs": true,
       "exec_interpreter": "node",
       "exec_mode": "cluster_mode",
       "autorestart": true,
       "vizion": false
      }
     ]
    }
    

    项目中pm2配置是从网上找的,搜的大部分都是以上这种,也看了各个字段大致意思,于是就把项目部署至服务器,然后每隔个几天服务就会不定时挂掉,为此运维也配合加了服务监控脚本,然而并没有用,这种状态持续了大概半个月,当时慌了一批,于是尝试了解具体每个配置项并在开发环境上配置观察
    当试了"max_memory_restart": "10M", // 重启占用最大内存这个配置时把10M改成1024M,服务从此没在挂掉
    参考文章:
    https://blog.csdn.net/Baby_lucy/article/details/82216454
    https://www.jianshu.com/p/e2a929ea8cfd

    2、连接数据库配置
    • config/db.js——关于连接mysql数据库配置文件
    const Sequelize = require('sequelize')
    let user = 'test_online'
    let pwd = '@#$12wipo'
    let host = '192.168.13.123'
    const HealthyDB = new 
    // 连接数据库简单写法
    Sequelize(`mysql://${user}:${pwd}@${host}/test_management`, {
      host: '192.168.13.123',
      port: 3306,
      define: {
        timestamps: false // 取消Sequelize自动给数据表加入时间戳(createdAt 以及 updatedAt)
      },
      timezone: '+08:00' // Mysql时区与Node时区不一致问题
    })
    module.exports = {
      HealthyDB // 将HealthyDB暴露出接口,方便Model调用
    }
    

    以上写法在以ip为host的地址是可以的,但是在发布上线时就不适用了,原因是因为线上数据库用的是阿里云rds数据库,host是rm-bnsq123.mysql.rds.aliyuncs.com这种形式,不是上面那种ip地址形式,会报连接数据库失败,猜测原因可能是上面拼接形式解析时出的问题,各种搜索后找到了以下配置方式:

    const Sequelize = require('sequelize')
    let configInfo = database[process.env.NODE_ENV]
    
    // // 预发环境
    const config = {
      // 数据库
      database: 'test_management',
      // 用户名
      username: 'test_online',
      // 密码
      password: '@#$12wipo',
      // 使用哪个数据库程序
      dialect: 'mysql',
      // 地址
      host:'rm-bnsq123.mysql.rds.aliyuncs.com',
      // 端口
      port: 3306,
      // 连接池
      pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
      },
      define: {
        timestamps: false // 取消Sequelize自动给数据表加入时间戳(createdAt 以及 updatedAt)
      },
      timezone: '+08:00' // Mysql时区与Node时区不一致问题
    }
    console.log(config,'config')
    const HealthyDB = new Sequelize(config)
    
    module.exports = {
      HealthyDB // 将HealthyDB暴露出接口,方便Model调用
    }
    

    以上配置方式使用了host为ip和阿里云rds数据库形式的配置

    3、解决Mysql时区 与 Node时区 不一致导致问题

    这个问题主要是接口新增后的时间字段和mysql中对应不上,通过Sequelize中添加配置项解决,在2中的config中添加timezone: '+08:00' // Mysql时区与Node时区不一致问题
    参考:
    https://blog.csdn.net/u011249920/article/details/80941799
    https://blog.csdn.net/chanlingmai5374/article/details/93190983

    相关文章

      网友评论

          本文标题:nodejs+Koa2实际项目中遇见的问题

          本文链接:https://www.haomeiwen.com/subject/jphhoctx.html