我正在使用更新模型方法通过 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语言或在两者之间的某个地方没有得到太多回报。
答案 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,但是为了以防万一,我把它留在了那里。