Express-TypeScript-реагировать: отправить ответ JSON после отправки представления из того же запроса - PullRequest
0 голосов
/ 16 ноября 2018

Ниже приведен мой код для простого экспресс-сервера, написанный на машинописном тексте.

import express from 'express';
import bodyParser from 'body-parser';
import path from 'path';
import fs from 'fs';
import { DISTDIR } from './shared/constants';
import LoginController from './controllers/login';
// import * as test from '../../helpers/util';

function name() {
  return {
    name: 'Amaan'
  };
}
class App {
  public express: express.Application;

  constructor() {
    this.express = express();
    this.middleware();
    this.routes();
  }
  private middleware(): void {
    this.express.use(function(req, res, next) {
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Headers', '*');
      next();
    });
    this.express.use(bodyParser.json());
    this.express.use(bodyParser.urlencoded({ extended: false }));
  }
  private routes(): void {
    this.express.get('/', function(req, res) {
      res.sendFile(path.join(projectDir, 'dist', 'index.html'));
    });
  }
}
export default new App().express;

Как вы можете видеть здесь, я отправляю обратно index.html, который содержит мой код React.

this.express.get('/', function(req, res) {
  res.sendFile(path.join(projectDir, 'dist', 'index.html'));
});

Теперь я столкнулся с проблемой, когда мне нужно отправитьответ от любого API в этом запросе также.Примерно так:

function name() {
  return {
    name: 'Amaan'
  };
}

private routes(): void {
  this.express.get('/', function(_, res) {
  res.setHeader('Content-type', 'text/html');
  fs.readFile(path.resolve(DISTDIR, 'index.html'), null, (err, data) => {
    if (err) {
      res.writeHead(404);
      res.write('Not found');
    } else {
      res.write(data);
    }
    res.setHeader('Content-type', 'text/json');
    res.send(name());
    res.end();
  });
});

Это дает мне ошибку 'Can\'t set headers after they are sent.'.

Скажите, пожалуйста, как я могу отправить ответ json вместе с представлением.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Один ответ на один запрос.Если вам нужно что-то при инициализации приложения, используйте функцию onLoad, чтобы сделать еще один запрос.

0 голосов
/ 16 ноября 2018

Провел некоторое исследование и обнаружил, что такого рода договоренности очень тесно связаны, и да, мы не можем отправить более одного ответа на запрос.Излишне говорить, что я использовал webpack-dev-server для запуска внешнего интерфейса и удалил промежуточное ПО из экспресс-кода.

0 голосов
/ 16 ноября 2018

Не думаю, что вы можете отправить json после отправки файла HTML в одном ответе. Вы можете создать компонент React для отправки другого запроса на получение данных.

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