gpt4 book ai didi

javascript - 使用NodeJS(公共(public)应用程序)时如何在shopify中获取当前商店?

转载 作者:行者123 更新时间:2023-12-05 00:26:46 27 4
gpt4 key购买 nike

我是 Shopify 应用开发新手,尤其是 Shopify API。
我使用 Shopify CLI 创建了一个工作应用程序,现在想要与 API 进行通信。
我尝试访问以下端点:https://{my_shop]/admin/api/2021-07/shop.json我了解到我需要一些访问 token 和商店名称才能访问此端点。
我在我的私有(private)应用程序部分下创建了一个访问 token 。
但我不知道如何获取当前登录的商店。
例如,当单击前端中的按钮时,我想调用我的端点,该端点又调用 Shopify API 端点并检索信息。我该如何以正确的方式做到这一点?以及如何获取当前登录的商店?
到目前为止,这是我的代码:

import "@babel/polyfill";
import dotenv from "dotenv";
import "isomorphic-fetch";
import createShopifyAuth, { verifyRequest } from "@shopify/koa-shopify-auth";
import Shopify, { ApiVersion } from "@shopify/shopify-api";
import Koa from "koa";
import next from "next";
import Router from "koa-router";
import axios from 'axios';

dotenv.config();
const port = parseInt(process.env.PORT, 10) || 8081;
const dev = process.env.NODE_ENV !== "production";
const app = next({
dev,
});
const handle = app.getRequestHandler();

Shopify.Context.initialize({
API_KEY: process.env.SHOPIFY_API_KEY,
API_SECRET_KEY: process.env.SHOPIFY_API_SECRET,
SCOPES: process.env.SCOPES.split(","),
HOST_NAME: process.env.HOST.replace(/https:\/\//, ""),
API_VERSION: ApiVersion.October20,
IS_EMBEDDED_APP: true,
// This should be replaced with your preferred storage strategy
SESSION_STORAGE: new Shopify.Session.MemorySessionStorage(),
});

// Storing the currently active shops in memory will force them to re-login when your server
restarts. You should
// persist this object in your app.
const ACTIVE_SHOPIFY_SHOPS = {};

app.prepare().then(async () => {
const server = new Koa();
const router = new Router();
server.keys = [Shopify.Context.API_SECRET_KEY];
server.use(
createShopifyAuth({
async afterAuth(ctx) {
// Access token and shop available in ctx.state.shopify
const { shop, accessToken, scope } = ctx.state.shopify;
const host = ctx.query.host;
ACTIVE_SHOPIFY_SHOPS[shop] = scope;

const response = await Shopify.Webhooks.Registry.register({
shop,
accessToken,
path: "/webhooks",
topic: "APP_UNINSTALLED",
webhookHandler: async (topic, shop, body) =>
delete ACTIVE_SHOPIFY_SHOPS[shop],
});

if (!response.success) {
console.log(
`Failed to register APP_UNINSTALLED webhook: ${response.result}`
);
}

// Redirect to app with shop parameter upon auth
ctx.redirect(`/?shop=${shop}&host=${host}`);
},
})
);

router.get("/test2", verifyRequest(), async(ctx, res) => {
const {shop, accessToken } = ctx.session;
console.log(shop);
console.log(accessToken);
})

router.get("/test", async (ctx) => {

const config = {
headers: {
'Content-Type': 'application/json',
'X-Shopify-Access-Token': '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'
}
}

await axios.get('${the_store_name_belongs_here}/admin/api/2021-07/shop.json', config).then(res => {
ctx.body = res.data;
});
});

const handleRequest = async (ctx) => {
await handle(ctx.req, ctx.res);
ctx.respond = false;
ctx.res.statusCode = 200;
};

router.post("/webhooks", async (ctx) => {
try {
await Shopify.Webhooks.Registry.process(ctx.req, ctx.res);
console.log(`Webhook processed, returned status code 200`);
} catch (error) {
console.log(`Failed to process webhook: ${error}`);
}
});

router.post(
"/graphql",
verifyRequest({ returnHeader: true }),
async (ctx, next) => {
await Shopify.Utils.graphqlProxy(ctx.req, ctx.res);
}
);

router.get("(/_next/static/.*)", handleRequest); // Static content is clear
router.get("/_next/webpack-hmr", handleRequest); // Webpack content is clear
router.get("(.*)", async (ctx) => {
const shop = ctx.query.shop;

// This shop hasn't been seen yet, go through OAuth to create a session
if (ACTIVE_SHOPIFY_SHOPS[shop] === undefined) {
ctx.redirect(`/auth?shop=${shop}`);
} else {
await handleRequest(ctx);
}
});


server.use(router.allowedMethods());
server.use(router.routes());
server.listen(port, () => {
console.log(`> Ready on http://localhost:${port}`);
});
});
请看看我的尝试 - 端点 /test和端点 /test2 .
test2 不工作。 ctx.session 为空。 ctx 本身为空。为什么? test1当我将商店名称硬编码到 url 中时正在工作,然后我得到所需的数据。但是我如何在里面放一个 shop 变量呢?这就是我的斗争。

最佳答案

我遇到了这个问题,并通过将 shop 作为查询参数传递来解决它。
我用以下方式调用端点:

axios.get('/test', {
params: {
shop: 'fo.myshopify.com'
}
});
并获得商店:
router.get("/test", async (ctx) => {
const shop = ctx.query.shop;
...
});
当然,您必须知道您调用端点的商店。

关于javascript - 使用NodeJS(公共(public)应用程序)时如何在shopify中获取当前商店?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69168644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com