Код: Выделить всё
@shopify/shopify-app-remix
Код: Выделить всё
shop { email }
Действие потока запускается правильно, и я могу аутентифицировать запрос с помощью shopify.authenticate.flow (request) . Я также могу успешно извлечь сеанс магазина в автономном режиме (который включает в себя AccessToken ) из моей базы данных Prisma с использованием SessionStorage , предоставленной библиотекой. /> Framework: Remix (используя шаблон приложения Shopify Remix) Действие function), возьмите электронную почту магазина, используя автономный токен.
Код: Выделить всё
shopify.server.js
Код: Выделить всё
// app/shopify.server.js (relevant parts)
import "@shopify/shopify-app-remix/adapters/node";
import {
ApiVersion,
AppDistribution,
shopifyApp,
} from "@shopify/shopify-app-remix/server";
import { PrismaSessionStorage } from "@shopify/shopify-app-session-storage-prisma";
import prisma from "./db.server";
const shopify = shopifyApp({
apiKey: process.env.SHOPIFY_API_KEY,
apiSecretKey: process.env.SHOPIFY_API_SECRET || "",
apiVersion: ApiVersion.January25, // Or your version
scopes: process.env.SCOPES?.split(","), // Includes 'read_shop'
appUrl: process.env.SHOPIFY_APP_URL || "",
authPathPrefix: "/auth",
sessionStorage: new PrismaSessionStorage(prisma),
distribution: AppDistribution.AppStore,
future: {
unstable_newEmbeddedAuthStrategy: true,
removeRest: false, // Currently set to false for testing, but also failed with true
},
// ...
});
export default shopify;
export const authenticate = shopify.authenticate;
export const sessionStorage = shopify.sessionStorage;
// ...
< /code>
модель сеанса Prisma: < /p>
// prisma/schema.prisma
model Session {
id String @id
shop String
state String
isOnline Boolean @default(false)
scope String?
expires DateTime?
accessToken String
userId BigInt?
firstName String?
lastName String?
email String?
accountOwner Boolean?
locale String?
collaborator Boolean?
emailVerified Boolean?
}
< /code>
Проблема: < /p>
Внутри моего обработчика действий потока (app/routes/api.flow.action.send-email.jsx
Код: Выделить всё
// Inside the action function, after getting shopDomain and offlineSession
// Method 1: Standard path via shopify.api.clients
try {
const client = new shopify.api.clients.Graphql({ session: offlineSession });
// FAILED with: TypeError: Cannot read properties of undefined (reading 'clients')
} catch (e) { console.error("Method 1 Failed", e); }
// Method 2: Using shopify.admin (doesn't seem correct for offline)
try {
const adminContext = await shopify.admin({ session: offlineSession });
// FAILED with: TypeError: shopify.admin is not a function
} catch (e) { console.error("Method 2 Failed", e); }
// Method 3: Direct import of GraphqlClient (only session)
try {
// import { GraphqlClient } from "@shopify/shopify-api";
const client = new GraphqlClient({ session: offlineSession });
// FAILED with: TypeError: Cannot read properties of undefined (reading 'isCustomStoreApp')
} catch (e) { console.error("Method 3 Failed", e); }
// Method 4: Direct import + specific config from main shopify object
try {
// import { GraphqlClient } from "@shopify/shopify-api";
// import shopify, { apiVersion } from "../shopify.server";
const client = new GraphqlClient({
config: shopify.config, // Also tried passing specific props like apiVersion, hostName etc.
session: offlineSession
});
// FAILED with: TypeError: Cannot read properties of undefined (reading 'isCustomStoreApp' or 'hostName')
} catch (e) { console.error("Method 4 Failed", e); }
// Method 5: Using admin client from authenticate.flow context
// const flowContext = await shopify.authenticate.flow(request);
// if (flowContext && flowContext.admin && typeof flowContext.admin.graphql === 'function') {
// const response = await flowContext.admin.graphql(SHOP_EMAIL_QUERY);
// // FAILED with: 401 Unauthorized (suggests this client isn't using the correct offline token)
// }
Какой правильный способ создания или получения аутентифицированного клиента API API Shopify Api GraphQL в пределах маршрута remix (например, обработчик действий потока), используя автономный токен сеанса, полученный из SessionStorage , особенно рассмотрение потенциального воздействия Removerest: True , если в настоящее время будет выдвинут в настоящее время, если в настоящее время будет выдвинут в настоящее время (даже будущий флаг (даже в будущем (даже будущий (даже будущий флаг (даже будущий (даже будущий) (даже если в настоящее время будет выдвинут в настоящее время? /> Я могу успешно сделать Shop {email} запрос с использованием инструмента Graphiql, предоставленного приложением Shopify Dev , что подтверждает автономный сеанс, а Read_shop обладает действием. Я просто не могу заставить клиента работать в коде обработки действий.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... mix-flow-a