JavaScript 如何将普通对象转换为另一种类型的实例
How to cast a plain object as a instance of another type in JavaScript
我正在尝试将会话存储在磁盘上以供本地开发,但我 运行 遇到了应用程序希望我 return 一个会话实例而不是一个实例的问题对象
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: Expected return to be instance of Session, but received instance of Object.
如何cast/transform 我正在从存储中解析的对象为预期的会话类型?
JSON 不保存 class,因此当您阅读 JSON 时返回的只是一个具有属性的普通对象。通常,将其重构为 class 的方法是为 class 创建一个构造函数,该构造函数接受您从 JSON 解析的确切对象作为构造函数的参数,然后构造函数将该数据复制到 class 实例的实例数据中。或者,如果您不控制构造函数,那么您可以使用现有的任何构造函数,创建该类型的新对象,然后设置您需要从您从 JSON.[= 解析的对象中设置的属性。 14=]
可以直接在用 Object.setPrototypeOf()
解析 JSON 得到的对象上设置原型,但我更喜欢使用构造函数设计,因为如果你有其他属性或更新的属性较新版本的代码,该构造函数可以通过适当的默认值以编程方式处理任何缺失的属性。在 JSON 中存储版本号通常也很有用,因此如果您随时间更改格式,您可以知道您正在从磁盘读取哪个版本,并且可以拥有适应旧版本或更新版本的代码 JSON.
注意,我通常也不会直接 JSON.stringify()
我的 class 因为我可能有不属于 JSON 的状态变量。相反,我创建了一个 .toJSON()
方法并让它为我生成 JSON 然后我的代码可以从我的实例数据中准确控制 JSON 中的内容。
JavaScript 确实没有 主格类型 object
值。它 有具体化的原型(通过 Object.getPrototypeOf
和 Constructor.prototype
)以及 instanceof
。看起来 Shopify 的库正在使用 instanceof
或 getProtoypeOf
来确定您的参数参数是否为“Session
”。
现在,我不熟悉 Shopify 的库,但您可以使用 Session
构造函数 - 或者创建对象的克隆(继承原型)。试试这个:
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;
}
会话似乎仅从 session.ts
导出。构造函数是空的,所以你不必担心,它只是一个具有属性的对象。要将非会话变成会话,您应该能够只分配给会话的属性。
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")))
);
}
我正在尝试将会话存储在磁盘上以供本地开发,但我 运行 遇到了应用程序希望我 return 一个会话实例而不是一个实例的问题对象
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: Expected return to be instance of Session, but received instance of Object.
如何cast/transform 我正在从存储中解析的对象为预期的会话类型?
JSON 不保存 class,因此当您阅读 JSON 时返回的只是一个具有属性的普通对象。通常,将其重构为 class 的方法是为 class 创建一个构造函数,该构造函数接受您从 JSON 解析的确切对象作为构造函数的参数,然后构造函数将该数据复制到 class 实例的实例数据中。或者,如果您不控制构造函数,那么您可以使用现有的任何构造函数,创建该类型的新对象,然后设置您需要从您从 JSON.[= 解析的对象中设置的属性。 14=]
可以直接在用 Object.setPrototypeOf()
解析 JSON 得到的对象上设置原型,但我更喜欢使用构造函数设计,因为如果你有其他属性或更新的属性较新版本的代码,该构造函数可以通过适当的默认值以编程方式处理任何缺失的属性。在 JSON 中存储版本号通常也很有用,因此如果您随时间更改格式,您可以知道您正在从磁盘读取哪个版本,并且可以拥有适应旧版本或更新版本的代码 JSON.
注意,我通常也不会直接 JSON.stringify()
我的 class 因为我可能有不属于 JSON 的状态变量。相反,我创建了一个 .toJSON()
方法并让它为我生成 JSON 然后我的代码可以从我的实例数据中准确控制 JSON 中的内容。
JavaScript 确实没有 主格类型 object
值。它 有具体化的原型(通过 Object.getPrototypeOf
和 Constructor.prototype
)以及 instanceof
。看起来 Shopify 的库正在使用 instanceof
或 getProtoypeOf
来确定您的参数参数是否为“Session
”。
现在,我不熟悉 Shopify 的库,但您可以使用 Session
构造函数 - 或者创建对象的克隆(继承原型)。试试这个:
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;
}
会话似乎仅从 session.ts
导出。构造函数是空的,所以你不必担心,它只是一个具有属性的对象。要将非会话变成会话,您应该能够只分配给会话的属性。
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")))
);
}