Apollo Server对接MySQL:如何直接从数据库查询文章数据并通过API返回
步骤1:安装所需依赖
安装Sequelize(对新手友好的MySQL ORM工具)和MySQL驱动:
npm install sequelize mysql2
步骤2:替换静态模型为MySQL数据库模型
原有models文件是本地静态数组,现在修改为对接MySQL的模型定义,修改models/index.js如下:
const { Sequelize, DataTypes } = require('sequelize'); // 替换为你自己的MySQL连接信息 const sequelize = new Sequelize('你的数据库名', '数据库用户名', '数据库密码', { host: 'localhost', dialect: 'mysql' }); // 定义Article模型,字段和你原有静态数据完全对应 const Article = sequelize.define('articledata', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, name: DataTypes.STRING, description: DataTypes.STRING, imgs: DataTypes.STRING, btnLink: DataTypes.STRING, headline: DataTypes.STRING, introduction: DataTypes.TEXT, definition: DataTypes.TEXT, tutorial: DataTypes.TEXT, specsText: DataTypes.TEXT, endText: DataTypes.TEXT, age: DataTypes.INTEGER, duration: DataTypes.INTEGER, players: DataTypes.INTEGER, category: DataTypes.STRING, designer: DataTypes.STRING, language: DataTypes.STRING, releaseDate: DataTypes.INTEGER, topic: DataTypes.STRING }, { tableName: 'articledata', // 对应你MySQL中的表名 timestamps: false // 如果你表中没有createdAt、updatedAt字段需要加此配置 }); // 测试数据库连接 (async () => { try { await sequelize.authenticate(); console.log('数据库连接成功'); // 首次运行如果需要自动创建表可打开下方注释,运行一次后关闭即可 // await sequelize.sync(); } catch (error) { console.error('数据库连接失败:', error); } })(); module.exports = { Article };
步骤3:修改Resolver逻辑
原有Resolver是查询静态数组,现在改为异步查询MySQL,修改后代码如下:
const { Article } = require('../models'); module.exports = { Query: { // 增加async关键字处理异步操作 article: async (parent, {id}) => { // 按主键ID查询数据库记录 return await Article.findByPk(id); } }, Node: { __resolveType(node) { // 原有toObject是MongoDB方法,现在直接判断字段即可 if(node.name){ return 'Article'; } } } }
步骤4:修复index.js语法问题
原有index.js存在两处语法错误,修改后如下:
const { ApolloServer } = require('apollo-server'); const schema = require('./schema'); const resolvers = require('./resolvers'); const server = new ApolloServer({ typeDefs: schema, resolvers, // 你当前未定义ArticleAPI,暂时删除dataSources配置避免报错,后续扩展时再补充即可 }) server.listen().then(({ url }) => { // 模板字符串需要用反引号包裹,不能用单引号 console.log(`Server ready at ${url}`); });
验证效果
启动服务后,在Apollo自带的Playground中运行如下查询,即可获取MySQL中对应ID的文章数据:
query getArticle($id: ID!) { article(id: $id) { id name description headline # 其他你需要返回的字段 } } # 变量栏输入 {"id": 1} 即可查询ID为1的文章
内容的提问来源于stack exchange,提问作者Nicole Höfler
相关产品推荐
相关产品推荐

