无法获取店铺名称

2023-12-29

在以前的版本中我用来获取当前商店名称是这样的:

router.get("/api/app", async (ctx) => {
  let shop = ctx.session.shop;
});

但是,在新版本中,我无法使用 ctx.session.shop 获取当前商店名称,我在日志中没有看到任何名为 name 的对象,也没有看到会话令牌,我确实看到了会话令牌和商店名称在 reffer 对象上,但我认为还有另一种方法可以直接访问它们。

那么,我如何获得当前的商店名称? 这是我的代码:

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 session from "koa-session";
import next from "next";
import Router from "koa-router";
import koaBody from "koa-body";

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,
  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 = {};

const server = new Koa();
const router = new Router();

router.get("/api/test", async (ctx) => {
  return (ctx.body = ctx.session);
});



app.prepare().then(async () => {
  server.keys = [Shopify.Context.API_SECRET_KEY];

  server.use(
    session(
      {
        sameSite: "none",
        secure: true,
      },
      server
    )
  );

  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}`);
      },
    })
  );

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

  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);
    }
  });

  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("(.*)", verifyRequest(), handleRequest); // Everything else must have sessions

  server.use(router.allowedMethods());
  server.use(router.routes());
  server.listen(port, () => {
    console.log(`> Ready on http://localhost:${port}`);
  });
});

提前致谢。


以下是在 server.js 文件中执行此操作的方法: 对于您的索引路由,即 router.get("/"),设置可以获取的商店名称的 cookie,如下所示。一旦商店所有者从管理员打开应用程序时设置了 cookie,现在当您从合作伙伴门户中设置的重定向链接(通常是 ngrock)打开应用程序时,商店名称将根据之前设置的 cookie 自动设置

完整代码:

    router.get("/", async ctx => {
    const shop = ctx.query.shop
    if (shop) {
        console.log("setting cookie");
        ctx.cookies.set("shop_name", shop, {
            secure: true,
            sameSite: 'none',
            httpOnly: false
        })
    }

    if (ctx.request.header.cookie) {
        var cookies_fetched = parseCookie(ctx.request.header.cookie)

        // This shop hasn't been seen yet, go through OAuth to create a session
        if (ACTIVE_SHOPIFY_SHOPS[shop] === undefined) {
            ctx.redirect(`/auth?shop=${cookies_fetched.shop_name}`)
        } else {
            await handleRequest(ctx)
        }
    } else {
        if (ACTIVE_SHOPIFY_SHOPS[shop] === undefined) {
            ctx.redirect(`/auth?shop=${shop}`)
        } else {
            await handleRequest(ctx)
        }
    }
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法获取店铺名称 的相关文章

随机推荐

  • setMaximumFractionDigits 的问题

    setMaximumFractionDigits 不适用于以下代码 NSString input 80 90 NSNumberFormatter numberFormatter NSNumberFormatter alloc init nu
  • 在傅立叶插值的上下文中返回函数的“传统”符号

    在数值分析中 我们学生有义务在 R 中实现代码 给定函数 f x 找到其傅立叶插值 tN x 并计算插值误差 f x t N x int 0 2 pi f x t N x 2 或各种不同的 N 我首先尝试根据以下公式计算 d 系数 d fr
  • C#:实时组合框更新

    我一直在尝试将文本文件加载到组合框中 然后创建一个按钮将我在组合框中所做的任何更改保存回文本文件 问题是 当我在组合框中输入某些内容时 所选的 项目 不会更新 我可以更改句子 但是一旦单击 保存 按钮 这也会更新组合框 它就会回到我编辑之前
  • 以 root 身份启动 Mysql

    我已经以 root 身份在我的测试服务器上启动了 mysql 我已经添加了 user root my cnf 中的行 由于我希望测试服务器升级到生产服务器 因此我想注释掉这一行并重新启动 有没有什么副作用 预期数据丢失 MySQL 的 ro
  • 出现错误:没有为一个或多个必需参数给出值

    下面是我的更新查询 它工作正常 但是当我添加时int DrId在参数字段 最后 检查条件条件 在此之后它向我显示以下错误 No value given for one or more required parameters 错误在哪里 因为
  • Node.js 在 openshift 中的部署

    我试图将 Node js 应用程序部署到 openshift 如此链接所示here http myapp jeewan rhcloud com 我理解这段代码 var http require http var server http cr
  • Sqlalchemy 如果表不存在

    我编写了一个模块 用于创建一个空数据库文件 def create database engine create engine sqlite myexample db echo True metadata MetaData engine me
  • 使用 RxJava 的状态机?

    我正在尝试全力以赴地使用 RxJava 并解决我遇到的这个问题 但它似乎非常不适合它 因为 RxJava 似乎不想处理任何类型的状态 而只是传递事件并改变它们来处理它们 我尝试用 RxJava 模拟的基本状态机行为是这样的 在应用程序启动事
  • 无法使用nodemailer发送html文本

    我无法使用 nodemailer 在邮件中发送 html 文本 exports send function req res console log req query var mailOptions to req query email s
  • 检查服务器上是否存在文件

    我正在尝试检查服务器上是否存在 ASP NET 网页后面带有 C 代码的文件 我知道该文件确实存在 因为我事先用一段代码将其放在服务器上 任何人都可以看到为什么找不到该文件 这是代码 wordDocName specifications C
  • Google Contacts API asp.net 设置和授权令牌

    是否有任何好的示例展示如何填写应用程序设置来创建请求设置 这是代码google https developers google com google apps contacts v3 using Google Contacts using
  • Python 中是否缓存了常量计算?

    假设我在 Python 中有一个函数 它使用一个常量计算的浮点值 如 1 3 def div by 3 x return x 1 3 如果我重复调用该函数 是否会自动缓存 1 3 的值以提高效率 或者我必须手动执行以下操作 def div
  • 创建主从表和对话框,如何重用相同的对话框来创建和编辑

    我正在尝试创建一个对话框 该对话框将用于创建对象和更新对象 因此 如果我碰巧单击 新建 按钮 我将看到一个包含要填充的空字段的对话框 或者如果我单击某个条目的编辑按钮 该条目的数据将显示在对话框中进行更新 按照 primefaces 展示版
  • 如何定义向量结束以便它不会无休止地继续下去?

    目前我有一个文本文件 其中包含与不同音乐剧艺术家有关的信息 David Byrne 1 Talking Heads Lead Vocals Chris Frantz 1 Talking Heads Drummer Tina Weymouth
  • 大多数现代系统中堆栈增长的方向是什么?

    我正在准备一些 C 语言培训材料 我希望我的示例适合典型的堆栈模型 Linux Windows Mac OSX PPC 和 x86 Solaris 和最新的 Unix 中的 C 堆栈朝什么方向发展 堆栈增长通常并不取决于操作系统本身 而是取
  • 全局执行上下文是否可以从执行堆栈中弹出?

    当JS代码开始运行时 全局执行上下文被创建并位于执行堆栈的底部 以 容纳 全局变量对象和 this 如果整个JS代码运行完后执行栈为空 并且没有全局执行上下文 我们如何仍然能够访问全局变量 例如 我正在运行一个带有 JS 代码的 html
  • 一个类可以扩展一个类并实现一个接口吗

    PHP 中的一个类可以同时扩展一个接口和另一个类吗 基本上我想这样做 interface databaseInterface public function query q public function escape s more met
  • 将 log4j 1.x 和 log4j 2 与依赖于 log4j 1.x 的第三方库混合

    我正在维护一个使用 log4j 1 x 和大型代码库的 Maven 项目 log4j 1 x不仅在现有代码中使用 项目所依赖的一些第三方库也使用它 我现在想开始使用 log4j 2 但我想知道是否值得这么麻烦 我知道可以将两者混合使用 参见
  • 在WPF中,我可以在2个按钮之间共享相同的图像资源吗

    我想在 WPF 中创建一个开 关按钮 并且希望它在用户单击它时使用图像更改其外观 如果它是打开的 则切换为关闭 如果它是关闭的 则切换为打开 我将要使用的图像添加到资源中
  • 无法获取店铺名称

    在以前的版本中我用来获取当前商店名称是这样的 router get api app async ctx gt let shop ctx session shop 但是 在新版本中 我无法使用 ctx session shop 获取当前商店名