graphql - Sequelize for GraphQL 中的 OneToMany 关联。自定义外键
问题描述
我正在尝试在 Sequelize 的帮助下为 GraphQL 创建一个 Apollo 服务器。
我遵循了 Sequelize 的文档和一些教程,但我仍然有错误:
User.hasMany(models.Recipe);
Recipe.belongsTo(models.User, { foreignKey: 'userId'} );
但是当我在 GraphQL 中执行一个突变以在我的数据库中添加一个新配方时,我观察我的控制台,它正在执行以下查询:
INSERT INTO "Recipe" ("id","title","ingredients","direction", "userId") VALUES (DEFAULT,$1,$2,$3) RETURNING "id","title","ingredients","direction","userId", **"UserId"**;
它在 RETURNING 中比预期多一个字段,返回什么和错误,我不知道为什么。
"message": "Doesn't exist column «UserId»",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"createRecipe"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"name": "SequelizeDatabaseError",
"parent": {
"length": 242,
"name": "error",
"severity": "ERROR",
"code": "42703",
"hint": "You probably want to refer column «Recipe.userId».",
我知道我可以更改外键并将其命名为大写字母('UserId'),这样可以解决问题,但我希望能够自定义我自己的外键。
根据要求,这些是我的迁移:
await queryInterface.createTable('Recipe', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
userId: {
type: Sequelize.INTEGER,
allowNull: false
},
title: {
allowNull: false,
type: Sequelize.STRING
},
ingredients: {
allowNull: false,
type: Sequelize.STRING
},
direction: {
allowNull: false,
type: Sequelize.STRING
}
});
await queryInterface.createTable('User', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
allowNull: false,
type: Sequelize.STRING
},
email: {
allowNull: false,
type: Sequelize.STRING
},
password: {
allowNull: false,
type: Sequelize.STRING
}
});
这是 de models/recipe.js:
module.exports = (sequelize, DataTypes) => {
const Recipe = sequelize.define('Recipe', {
title: {
type: DataTypes.STRING,
allowNull: false
},
ingredients: {
type: DataTypes.STRING,
allowNull: false
},
direction: {
type: DataTypes.STRING,
allowNull: false
}
}, {
modelName: 'Recipe',
freezeTableName: true,
timestamps: false
});
Recipe.associate = function(models) {
Recipe.belongsTo(models.User);
};
return Recipe;
};
这是 schema.js:
const { gql } = require('apollo-server')
const typeDefs = gql`
type Query {
user(id: Int!): User
allRecipes: [Recipe!]!
recipe(id: Int!): Recipe
}
type User {
id: Int!
name: String!
email: String!
recipes: [Recipe!]!
}
type Recipe {
id: Int!
title: String!
ingredients: String!
direction: String!
user: User!
}
type Mutation {
createUser(name: String!, email: String!, password: String!): User!
createRecipe(
userId: Int!
title: String!
ingredients: String!
direction: String!
): Recipe!
}
`
module.exports = typeDefs
谢谢!
解决方案
您还应该指明foreignKey
选项hasMany
:
User.hasMany(models.Recipe, { foreignKey: 'useId' })
推荐阅读
- kubernetes - Google 调试:如何调试可执行 jar 中的库 - 错误:在可执行文件中找不到文件
- postgresql - 我们如何在 PostgreSQL 中转换给定的日期时间格式?
- javascript - 如何获取通过 React JSX 定义的 html 元素?
- java - 一次登录不能使用多个用户
- java - 迭代集合时 Java 流/forEach 中的定期操作
- spring - Spring boot 2 Prometheus 不提取数据库指标
- ruby-on-rails - 找不到 Spree::Page 错误如何解决此问题
- keras - 用于时间序列分析 keras 的 lstm 显示 numpy.ndarray 对象没有属性“_validate_or_infer_batch_size”
- python - 如何使用变量 .format 写入文件?
- qsplashscreen - QSplashScreen 不显示图像 pyqt5