我想知道是否可以通过某种方式从快递服务器发送对象,然后在接收端检查instanceof
该对象。
我正在为Express编写集成测试,并希望检查响应正文的instanceof
。可悲的是,原型丢失了(我猜是由于stringify
和parse
而丢失了。)
要澄清:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const request = require('request');
app.use(bodyParser.json());
app.use(bodyParser.text());
app.use(bodyParser.urlencoded({ extended: true }));
class ParentClass {
constructor(name) {
this.name = name;
}
};
class ChildClass extends ParentClass {
constructor(name, age) {
super(name),
this.age = age;
}
}
app.get('/', (req, res) => {
let myChild = new ChildClass('test', 21)
res.json(myChild)
});
server = app.listen('3005', '0.0.0.0');
request.get(`http://localhost:3005`, (err, response, body) => {
console.log(JSON.parse(body) instanceof ParentClass)
})
要打印的body
是:
name: 'test',
age: 21,
__proto__: Object
我的最终目标是,行body instanceof ParentClass
将返回 true ,但当前返回 false 。
答案 0 :(得分:1)
HTTP请求返回一个字符串,在这种情况下为对象的字符串化版本。这将不包含有关javascript类的任何数据,因此您将无法在接收端使用instanceof
,因为它只是一个字符串。
您可能能够做的一件事是在基类中添加一个属性,该属性将其原型链编译为一个数组,然后您可以简单地检查所要查找的类名是否在该数组中。
class ParentClass {
constructor(name) {
this.name = name;
// build class chain
this.classes = []
let p = Object.getPrototypeOf(this)
while (p) {
this.classes.push(p.constructor.name)
p = Object.getPrototypeOf(p)
}
}
};
class ChildClass extends ParentClass {
constructor(name, age) {
super(name)
this.age = age;
}
}
let myChild = new ChildClass('test', 21)
// has classes property that will be stringified
let childString = JSON.stringify(myChild)
console.log(childString)
// on the client side
let obj = JSON.parse(childString)
console.log("Instance of Parent?", obj.classes.includes('ParentClass')) // instaed of instanceof
真的不确定这是否适用于您的用例……要测试似乎很奇怪。测试实际行为可能要比具体实现更好。