Отправить объект с его родительским классом через экспресс - PullRequest
0 голосов
/ 12 мая 2019

Мне было интересно, есть ли способ отправить объект с экспресс-сервера, а затем проверить instanceof этот объект на принимающей стороне.

Я пишу интеграционные тесты дляэкспресс, и хотите проверить 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 .

1 Ответ

1 голос
/ 12 мая 2019

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

Действительно не уверен, сработает ли это для вашего варианта использования ... это кажется странной вещью для проверки. Возможно, лучше проверить реальное поведение, чем конкретную реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...