如何在JavaScript中将普通对象强制转换为另一种类型的实例

如何在JavaScript中将普通对象强制转换为另一种类型的实例,javascript,node.js,shopify,javascript-objects,Javascript,Node.js,Shopify,Javascript Objects,我试图将会话存储在磁盘上以供本地开发,但遇到了一个问题,应用程序希望我返回会话实例而不是对象 function storeCallback(session) { console.log("storeCallback ", session); fs.writeFileSync("./session.json", JSON.stringify(session)); return true; } function loadCallback(id)

我试图将会话存储在磁盘上以供本地开发,但遇到了一个问题,应用程序希望我返回会话实例而不是对象

function storeCallback(session) {
  console.log("storeCallback ", session);
  fs.writeFileSync("./session.json", JSON.stringify(session));
  return true;
}

function loadCallback(id) {
  console.log("loadCallback ", id);
  const session = fs.readFileSync("./session.json", "utf8");
  return JSON.parse(session);
}
会议内容如下:

Session {
   id: '0984e7db-ad80-4276-966d-9db54fac11c2',
   shop: 'swiftnextstep.myshopify.com',
   state: '113617456401679',
   isOnline: true
 }
一旦我保存并读回,它看起来是这样的

 {
   id: '0984e7db-ad80-4276-966d-9db54fac11c2',
   shop: 'swiftnextstep.myshopify.com',
   state: '113617456401679',
   isOnline: true
 }
我得到一个错误
InternalServerError:预期返回为会话实例,但收到了对象实例。


如何将我正在解析的对象从存储转换为预期的会话类型?

JSON不保存类,因此读取JSON时得到的只是一个具有属性的普通对象。通常,将其重新构造为类的方式是为类创建一个构造函数,该构造函数接受从JSON解析的确切对象作为参数传递给构造函数,然后构造函数将该数据复制到类实例的实例数据中。或者,如果您不控制构造函数,则使用任何构造函数,创建该类型的新对象,然后根据从JSON解析的对象设置需要设置的属性

可以直接在解析JSON得到的对象上设置原型,但我更喜欢使用构造函数设计,因为如果在较新版本的代码中有其他属性或较新的属性,那么该构造函数可以使用适当的默认值以编程方式处理任何缺少的属性。在JSON中,存储版本号通常也很有用,因此,如果随着时间的推移更改格式,您可以知道从磁盘读取的是什么版本,并且可以拥有适应旧版本或新版本JSON的代码


注意,我通常也不会直接
JSON.stringify()
my类,因为我可能有不属于JSON的状态变量。相反,我创建了一个
.toJSON()
方法,让它为我生成JSON,然后我的代码可以从我的实例数据精确地控制JSON中的内容和内容。

JavaScript实际上没有
对象
值的命名类型。它确实有被具体化的原型(通过
Object.getPrototypeOf
Constructor.prototype
)以及
instanceof
。Shopify的库似乎正在使用
instanceof
getProtoypeOf
来确定您的参数参数是否为“
Session

现在,我对Shopify的库不太熟悉,但是您可以使用
会话
构造函数,或者创建对象的克隆(该克隆携带了原型)。试试这个:

function loadCallback(id) {
  console.log("loadCallback ", id);
  const sessionJson = fs.readFileSync("./session.json", "utf8");
  const sessionObj  = new Session(); // assuming the ctor has no parameters
  
  const session2 = Object.assign( sessionObj, sessionJson ); // copy `sessionJson`'s properties into `sessionObj`.

  return session2;
}

会话看起来只能从导出。构造函数是空的,所以你不必担心,它只是一个具有属性的对象。要将非会话转换为会话,您应该能够只分配给会话的属性

import { Session } from "@shopify/shopify-api/dist/auth/session/session";

function loadCallback(id) {
  console.log("loadCallback ", id);
  return Object.assign(
    new Session(),
    JSON.parse(fs.readFileSync("./session.json", "utf8")))
  );
}

什么是
会话
?您能否显示传递给
storeCallback
的对象是在哪里创建的?您是否尝试过将..
(存储为任何一种)作为Session
?@scifany这不是typescript您是对的@CertainPerformance@CertainPerformance,我没有访问调用storeCallback的代码的权限,我只是从包中重写回调函数,会话是loadCallback针对itThanks断言的实例类型!这正在起作用,我只是调整您的响应以匹配会话的正确位置。