通过express发送带有其父类的对象

时间:2019-05-12 17:34:42

标签: javascript node.js express

我想知道是否可以通过某种方式从快递服务器发送对象,然后在接收端检查instanceof该对象。

我正在为Express编写集成测试,并希望检查响应正文的instanceof。可悲的是,原型丢失了(我猜是由于stringifyparse而丢失了。)

要澄清:

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

1 个答案:

答案 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

真的不确定这是否适用于您的用例……要测试似乎很奇怪。测试实际行为可能要比具体实现更好。