近几天Flask、小程序中的坑

Author Avatar
patrickcty 6月 09, 2018

关于服务器部署 Flask 的坑

  • 在服务器上如果使用 uWSGI 来运行 Flask 的话是没办法读取到环境变量的,因而可以考虑把一些配置信息写到 config 文件中。
  • Nginx 的配置文件中不同的 server 对应的可以是不同的服务器与端口,也可以是同一个服务器的多个不同的请求端口,例如 http 的 80 和 https 的 443。其中相应的配置文件一般存放在 /etc/nginx 目录下,我的配置文件存放在 /etc/nginx/sites-available 下,编辑的时候需要 sudo 权限。
  • uWSGI 的配置文件中,不知道为什么增加了 buffer-size = 32768 字段就无法成功运行,去掉后就正常,如要注意的话,如果配置文件中端口是用 socket 来配置的,那么就必须要通过 Nginx 来处理访问,而想直接通过 http 来访问就应该配置为 http。

小程序的坑

  • APPID 和 js_code 是相互对应的,如果不对应地调用微信的接口就会返回 Invalid APPID 的错误。
  • 微信中的几乎所有接口都是异步接口,因为经常会出现数据不一致的问题,如果想保证后面数据调用前面数据是一致的话就应该采用回调嵌套的链式调用,或者使用 JS 中的异步,例如 promiseasync/await 等,下面是一个封装了微信接口的 promise (微信已经自带)的使用实例:
function wxPromisify(fn) {
  return function (obj = {}) {
    return new Promise((resolve, reject) => {
      obj.success = function (res) {
        resolve(res)
      }

      obj.fail = function (res) {
        reject(res)
      }

      fn(obj)
    })
  }
}

function getRequest(url, data) {
  var getRequest = wxPromisify(wx.request)
  return getRequest({
    url: url,
    method: 'GET',
    data: data,
    header: {
      'Content-Type': 'application/text'
    }
  })
}

onLoad: function () {
    var that = this;
    var url = 'https://api.jnugeek.cn/api/'
    var commentItemsData;

    var driverObj = wx.getStorageSync('searchDriver')
    this.setData({
      searchDriver: driverObj
    })

    // 使用 then 来进行链式调用
    util.getRequest(
      url + 'driver_evals/' + driverObj.id
    ).then(res => {
      console.log('patrick')
      console.log(res.data)
      
      var promises = []
      commentItemsData = res.data
      commentItemsData.forEach(item => {
        // 多个 promise 对象放在数组里面
        promises.push(
          util.getRequest(
            url + 'user_info/' + item.user_id
          ).then(data => {
            console.log('data')
            console.log(data)
            console.log(url)
            console.log(commentItemsData)
            commentItemsData[commentItemsData.indexOf(item)]['user'] = data.data
          })
        )
      })

      // 等数组中所有的都返回了就会执行回调
      return Promise.all(promises).then(() => {
        that.setData({
          commentItems: commentItemsData
        })
      })
    })
}

参考教程:

  1. 使用 primise.all 解决循环异步
  2. Promise 的四种常用方法
  3. 微信小程序 引入es6 promise
  4. 微信小程序中使用Promise进行异步流程处理