如何在Sequelize中针对更新突变返回模型(或与此相关的任何东西)?

时间:2019-05-28 22:19:07

标签: javascript mysql node.js graphql sequelize.js

我正在使用更新模型方法通过 mysql2 方言更新Sequelize中的条目。似乎对于MySQL,您只能返回受影响的行数。我想将其作为布尔值传回。

应该指出的是,我对JS / ES6,Node还是相当陌生,我对PHP更为精通,因此如果答案很明显或对JS有基本误解,我会提前道歉,但是我保证我已经为此工作了几个小时。在线文档和在线示例介绍了更新方法。

我能找到的最接近的答案是:Sequelize on GraphQL update not return anything

为简洁起见,我已删除了这段代码中无关的部分。

型号:

export default (sequelize, DataTypes) => {
    const Payment = sequelize.define('payment', {
        ...
        processed: {
            type: DataTypes.INTEGER(1).UNSIGNED,
            allowNull: false,
            defaultValue: '0'
        },
        ...
    return Payment;

模式:

...
type Payment {
id: Int!
amount: Float!
processedTime: Int
processed: Int!
dueDate: Int!
status: PaymentStatuses

Employee: Employee
Client: Client!
Merchant: Merchant
PaymentType: PaymentType
}

type Query {
getPayment(id: Int!): Payment
}
type Mutation {

updatePaymentStatus(id: Int!, processed: Int!): Boolean

}

我本来想做的是:

updatePaymentStatus(id: Int!, processed: Int!): Payment!

解析器:

Mutation {
updatePaymentStatus: async (parent, {id, processed}, {models}) => 
{await models.Payment.update({processed}, {where: {id}})
.then((datareturned) => {return datareturned[0]})}
}

如果我检查数据库,则该更新实际上正在正常运行。如果我console.log(datareturned [0])我得到1(如果没有更新任何行,则得到0)。

我希望能够至少返回我的模式中所述的布尔值,但是无论我尝试什么,我都会得到null或其他错误,因为返回的值为null。我意识到我可能会错误地假设返回1将被假定为true,但我也尝试过:

.then((datareturned) => {if (datareturned[0] === 1) {return true}})}

在GraphiQL中:

mutation{
  updatePaymentStatus(id:1, processed:0) 
}

响应:

{
  "data": {
    "updatePaymentStatus": null
  }
}

我不确定问题是否出在我缺乏JS知识上,还是Sequelize使用MySQL语言或在两者之间的某个地方没有得到太多回报。

2 个答案:

答案 0 :(得分:0)

嘿,我昨晚遇到了这个...我是在解析器中这样做的

addUserProfileCertification: async (_, args, { models }) => {
      try {
        await models.ProfileCompanyCertification.create(args.input);
        return true;
      } catch (err) {
        logger.error(err);
      }
      return false;
    },

和我的突变

addUserProfileCertification(input: ProfileCertificationInput!): Boolean

GraphiQL结果看起来像

{
  "data": {
    "addUserProfileCertification": true
  }
}

如果需要,您可以轻松返回整个模型,方法是在解析器底部返回一个带有ID的id的findOne,例如...

updateUserProfileContact: async (_, args, { models }) => {

      let returnValue = null;
      const { id, input } = args;
      try {
        await models.ProfileContact.update(input, { where: { id } });
        returnValue = await models.ProfileContact.findOne({ where: { id } });
      } catch (err) {
        logger.error(err);
      }
      return returnValue;
    },

您只需要告诉您的突变期望付款类型而不是布尔值,就可以通过仅选择付款中的某些字段(作为您输入GraphiQL的一部分)来优化您想要传递回客户的内容

答案 1 :(得分:0)

这最终为我工作,为此将解析器更改为:

updatePaymentStatus: async (parent, {id, processed}, {models}) => {
            try {
                const foundPayment = await models.Payment.findByPk(id)
                if (foundPayment){
                models.Payment.update({processed: id}, {where: {id: id}})

                return true;
                }
                else{
                    return false;
                }
            }
            catch (e) {
                console.log(e);
                return false;
            }

        },

我想确保在运行更新之前已存在付款ID,因为无论行是否存在,更新都会运行。我不确定我是否还需要try catch,但是为了以防万一,我把它留在了那里。