问题描述中提到,Apollo GraphQL在使用PostgreSQL时无法更新mutation结果,但在使用SQLite时可以正常工作。解决这个问题的方法可能涉及到数据库配置或者Apollo服务器的设置。
首先,确保在Apollo服务器的配置中正确设置了PostgreSQL数据库的连接信息。检查以下配置是否正确:
const { ApolloServer } = require('apollo-server');
const { Pool } = require('pg');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const pool = new Pool({
user: 'your_user',
host: 'your_host',
database: 'your_database',
password: 'your_password',
port: 5432, // or your PostgreSQL port
});
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
return {
db: pool,
};
},
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
确保配置中的数据库连接信息准确无误,并且已经安装了"pg"模块。
如果配置正确,但是仍然无法更新mutation结果,可能是由于PostgreSQL的事务问题导致的。默认情况下,Apollo服务器在执行mutation时使用数据库事务来确保数据的一致性。但是,PostgreSQL对事务隔离级别的支持不同于SQLite。
在Apollo服务器的配置中,可以尝试将事务隔离级别设置为可序列化(serializable),这样可以强制执行严格的事务隔离。修改配置如下:
const { ApolloServer } = require('apollo-server');
const { Pool } = require('pg');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const pool = new Pool({
user: 'your_user',
host: 'your_host',
database: 'your_database',
password: 'your_password',
port: 5432, // or your PostgreSQL port
});
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
return {
db: pool,
};
},
introspection: true,
playground: {
settings: {
'request.credentials': 'same-origin',
},
},
engine: {
apiKey: process.env.APOLLO_ENGINE_API_KEY,
},
subscriptions: {
path: '/subscriptions',
onConnect: (connectionParams, webSocket, context) => {
console.log('Client connected');
},
onDisconnect: (webSocket, context) => {
console.log('Client disconnected');
},
},
persistQuery: {
async storePersistedQuery({ hash, query }) {
// Store the query hash and query to a persistent store
// e.g. Redis, PostgreSQL
await redis.set(hash, query);
},
async getPersistedQuery({ hash }) {
// Retrieve the query stored in the persistent store
// based on the query hash
const query = await redis.get(hash);
return query;
},
},
cacheControl: {
defaultMaxAge: 5,
},
tracing: true,
debug: true,
engine: {
apiKey: process.env.APOLLO_ENGINE_API_KEY,
},
// 设置事务隔离级别为可序列化(serializable)
plugins: [
{
serverWillStart() {
pool.query('BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;');
},
},
],
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
通过在Apollo服务器配置的plugins中设置事务隔离级别为可序列化(serializable),可以尝试解决PostgreSQL无法更新mutation结果的问题。
希望这些解决方案对你有所帮助!