Vuex和mysql连接对象:不要在变异处理程序

时间:2017-10-18 11:07:16

标签: javascript vuejs2 vuex

我有一个电子应用程序,它使用mysql包直接连接到我的数据库。我要做的是将connection创建的mysql.createConnection()对象存储在Vuex状态。然后我想使用这个对象从数据库中获取一些数字。

我为Vuex商店获得了这段代码:

const state = {
  connectionObject: null,
  numbers: [],
};

const getters = {
  getNumbers: state => state.numbers,
  getConnectionObject: state => state.connectionObject,
};

const mutations = {
  SET_NUMBERS(state, numbers) {
    state.numbers = Object.assign({}, numbers);
  },
  SET_CONNECTION_OBJECT(state, connection) {
     state.connectionObject = connection;
  },
};

const actions = {
  fetchNumbers({ state, commit }) {
    const connection = _.cloneDeep(state.connectionObject);
    connection.query({
      sql: 'SELECT * FROM `numbers`',
      timeout: 40000,
    }, async (error, results) => {
      if (error instanceof Error) {
        throw new Error(error);
      }
      commit('SET_NUMBERS', await results);
    });
  },
  connectToDatabase({ commit }, data) {
    const connection = mysql.createConnection(data);
    return new Promise((resolve, reject) => {
      connection.connect(async (err) => {
        if (err) {
          return reject(err);
        }
        commit('SET_CONNECTION_OBJECT', await connection);
        commit('SET_DB_CONNECTION_STATE', data);
        return resolve(connection);
      });
    });
  },
};

一旦我运行代码,我得到Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] Do not mutate vuex store state outside mutation handlers.",并且在执行connection.query()时抛出此错误。

我很难理解为什么它无法正常工作,因为我毕竟从状态克隆connectionObject。似乎它的观察者也被克隆了。有没有办法避免它?

1 个答案:

答案 0 :(得分:1)

连接对象高度可变,无法存储。您所做的每个连接都会更改连接对象的属性。我只会将返回存储在存储中,数据更新到操作中,并且应该使vosex可以访问connectionobject,但要注意它是全局的,这会使你的应用程序更容易入侵。使其可访问的一种方法是简单地将其声明为状态之外的变量。

如果您需要进一步的建议,那么知道您使用哪个SQL包以便为您提供一些代码会很有意义。