TypeError: Cannot read properties of undefined (reading 'replace') - Trying to establish Rest Client

Shopify Partner
2 0 0
import "@shopify/shopify-api/adapters/node";
import { shopifyApi, LATEST_API_VERSION, Session} from "@shopify/shopify-api";
import express from "express";
import dotenv from "dotenv";
import axios from "axios";

import cookieParser from 'cookie-parser';

import { initializeApp, applicationDefault, cert } from 'firebase-admin/app';
import { getFirestore, Timestamp, FieldValue, Filter } from 'firebase-admin/firestore';
import serviceAccount from './serviceKey.json' assert { type: 'json' };// const { initializeApp, cert } = require('firebase-admin/app');

  credential: cert(serviceAccount)

const db = getFirestore();

const host = "sawfly-wealthy-mosquito.ngrok.app";

const shopify = shopifyApi({
  apiKey: process.env.apiKey,
  apiSecretKey: process.env.apiSecretKey,
  scopes: ["read_orders", "write_orders", "read_products", "write_products"],
  hostName: host,

const app = express();


const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
  console.log(`Ngrok host: https://${host}/`);
  console.log(`Ngrok auth host: https://${host}/auth?shop=${process.env.SHOPNAME}`);
  console.log(`Ngrok auth callback host:  https://${host}/auth/callback`);
  console.log(`Ngrok fetch some data host: https://${host}/fetch`);

  when calling auth, you need the name of the user's store before you 
  can correctly request the website application

  You just ask the user to provide a domain that can be found when they go to:
  'https://admin.shopify.com/store/YOURSTORE' -> settings -> top left
  below username, copy and paste shopname


app.get("/auth", async (req, res) => {
  res.cookie('shopName', req.query.shop);
  await shopify.auth.begin({
    shop: shopify.utils.sanitizeShop(req.query.shop, true),
    callbackPath: "/auth/saveInfoRedirect",
    isOnline: false,
    rawRequest: req,
    rawResponse: res,

app.get('/auth/saveInfoRedirect', async (req, res) => {
  // The library will automatically set the appropriate HTTP headers
  const callback = await shopify.auth.callback({
    rawRequest: req,
    rawResponse: res,

  res.cookie('shopName', callback.session.shop); //write this to local storage so it can be accessed from

  const data = {
    session: JSON.stringify(callback.session.toObject()),
  const response = await db.collection('clients').doc(callback.session.shop).set(data);

  res.redirect('/fetch?shopName=' + callback.session.shop);

app.get('/fetch', async (req, res) => {
  //fetch the path from the url parameters

  const path = req.query.path;

  const fetchSession = await getSessionFromStorage(req.query.shopName);

  const session = new Session(fetchSession);

  console.log(session, "reconstructed session");

  if (!session) {
    res.status(401).send('Session not found, please reauthenticate ');

    console.log('establishing client...');
    const client = new shopify.clients.Rest({
      apiVersion: LATEST_API_VERSION,

    const data = await client.get({
      path: path,

  catch (error) {

    res.status(500).send("somethings not right here")


const getSessionFromStorage = async (name) => {
  const doc = await db.collection('clients').doc(name).get();
  return JSON.parse(doc.data().session);

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));

I have this code and when trying to make a Rest Client I get the error 

TypeError: Cannot read properties of undefined (reading 'replace')
    at C:\Users\**\Documents\shopify-app-sync\node_modules\@shopify\admin-api-client\dist\rest\client.js:86:30

I don't really understand what I'm doing wrong, it's probably obvious, but thanks for any help!

Reply 1 (1)

Shopify Partner
2 0 0

Figured it out, can't figure out how to delete, sorry, thanks for the consideration!