无法通过Apollo Studio Sandbox连接本地Serverless Offline GraphQL服务器
我用serverless offline运行GraphQL服务器,尝试连接Apollo Studio,但一周前还能正常连接,现在却连不上了。把服务部署到AWS后,Apollo Studio能正常连接部署后的服务器。
环境信息
- 设备:MacBook M1 Pro
- Node版本:15.6
根据配置,我在http://localhost:3000/dev/playground启动了playground,能访问页面但无法连接服务器。另外,用本地网络IPhttp://192.168.1.3:3000/dev/playground也打不开,但React应用却能通过http://192.168.1.3:3000正常访问。
我的serverless.yml配置如下:
service: serverless-graphql-rds frameworkVersion: "3.8.0" provider: name: aws runtime: nodejs14.x stage: ${env:PROVIDER_STAGE} region: ${env:REGION} environment: JWT_SECRET: ${env:JWT_SECRET} DATABASE_URL: ${env:DATABASE_URL} REDIRECT_TO_DASHBOARD: ${env:REDIRECT_TO_DASHBOARD} HUB_SPOT_CLIENT_ID: ${env:HUB_SPOT_CLIENT_ID} HUB_SPOT_CLIENT_SECRET: ${env:HUB_SPOT_CLIENT_SECRET} HUB_SPOT_REDIRECT_URI: ${env:HUB_SPOT_REDIRECT_URI} plugins: - serverless-plugin-typescript - serverless-offline package: patterns: - "migrations/**" - "**.js" - "config" custom: serverless-offline: httpPort: ${env:httpPort, 3000} lambdaPort: ${env:lambdaPort, 3002} serverless-plugin-typescript: tsConfigFileLocation: "./tsconfig.json" functions: graphql: handler: server.handler events: - http: path: graphql method: post cors: true playground: handler: server.playgroundHandler events: - http: path: playground method: get cors: true oauth-callback: handler: ./rest-apis-handlers/oauth-callback.handler events: - http: path: oauth-callback method: get cors: true
包含handler函数的server.ts文件如下:
import { ApolloError, ApolloServer } from "apollo-server-lambda"; import lambdaPlayground from "graphql-playground-middleware-lambda"; import { verifyToken } from "./common/jwt"; import { useContext } from "./core/context"; import resolvers from "./graphql/resolvers"; import typeDefs from "./graphql/schema"; const server = new ApolloServer({ typeDefs, resolvers, context: ({ event, context, express }) => { const auth = express.req.headers["authorization"] as string; if (auth) { const [_, token] = auth.split("Bearer "); try { const user = verifyToken(token); if (user) { return useContext({ type: "user", properties: { ...user, }, }); } else { throw new ApolloError("Not authenticated", "UNAUTHENTICATED"); } } catch (ex) {} } return useContext({ type: "public", }); }, }); export const handler = server.createHandler({}); // for local endpointURL is /graphql and for prod it is /stage/graphql export const playgroundHandler = (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; return lambdaPlayground({ endpoint: process.env.REACT_APP_GRAPHQL_ENDPOINT, })(event, context, callback); };
- 本地网络绑定限制:serverless-offline默认可能只绑定localhost,导致无法通过局域网IP访问。在
serverless.yml的custom.serverless-offline配置里添加host: 0.0.0.0,让服务监听所有网卡,这样既能用localhost访问,也能通过局域网IP访问。修改后配置示例:
custom: serverless-offline: httpPort: ${env:httpPort, 3000} lambdaPort: ${env:lambdaPort, 3002} host: 0.0.0.0
环境变量配置错误:playground的endpoint依赖
REACT_APP_GRAPHQL_ENDPOINT环境变量,本地运行时这个变量可能没正确设置为/dev/graphql(serverless offline会自动添加stage前缀)。检查本地.env文件,确保变量值为/dev/graphql,而非生产环境路径。CORS配置不完整:虽然
serverless.yml里设置了cors: true,但Apollo Studio作为外部客户端,可能需要更明确的CORS规则。在ApolloServer的createHandler中补充CORS配置:
export const handler = server.createHandler({ cors: { origin: true, credentials: true, methods: ['POST', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'] } });
依赖包版本冲突:一周前能正常运行,可能是近期更新了
serverless-offline、apollo-server-lambda等依赖,引发兼容性问题。查看package.json的依赖版本,回退到之前能稳定运行的版本,比如锁定serverless-offline的版本号。Node版本兼容性问题:你使用的Node 15.6是较旧版本,而serverless框架及插件可能对Node版本有更高要求。尝试升级Node到LTS版本(如16.x或18.x),旧版本可能存在网络或兼容性bug。
内容的提问来源于stack exchange,提问作者Shadab

