Как мне вернуть результаты из браузера, используя sequeilize на nodejs express? - PullRequest
0 голосов
/ 26 февраля 2019

Я проверил результаты запроса с помощью console.log ().Поэтому я хотел увидеть это в браузере.Я получаю сообщение об ошибке на консоли, когда открываю URL (http://localhost:3000/api/menu/all) через браузер.

GET /api/menu/all 200 11.418 ms - -
Executing (default): SELECT * FROM Menus
[ [ TextRow {
      id: 1,
      parent_id: null,
      name: 'Admin',
      url: '/admin',
      order: 0,
      description: 'admin page category',
      is_admin: 'Y',
      is_active: 'Y',
      created_at: 2019-02-23T21:12:10.000Z,
      updated_at: 2019-02-23T21:12:10.000Z },
    TextRow {
      id: 2,
      parent_id: null,
      name: 'Index',
      url: '/',
      order: 0,
      description: 'publish page category',
      is_admin: 'N',
      is_active: 'Y',
      created_at: 2019-02-23T21:12:10.000Z,
      updated_at: 2019-02-23T21:12:10.000Z } ] ]
Unhandled rejection Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
  at ServerResponse.setHeader (_http_outgoing.js:482:11)
  at ServerResponse.header (/Users/master/project/demo/server/node_modules/express/lib/response.js:767:10)
  at ServerResponse.json (/Users/master/project/demo/server/node_modules/express/lib/response.js:264:10)
  at ServerResponse.send (/Users/master/project/demo/server/node_modules/express/lib/response.js:158:21)
  at models.sequelize.query.then (/Users/master/project/demo/server/app/controllers/MenuController.js:9:9)
  at tryCatcher (/Users/master/project/demo/server/node_modules/bluebird/js/release/util.js:16:23)
  at Promise._settlePromiseFromHandler (/Users/master/project/demo/server/node_modules/bluebird/js/release/promise.js:512:31)
  at Promise._settlePromise (/Users/master/project/demo/server/node_modules/bluebird/js/release/promise.js:569:18)
  at Promise._settlePromise0 (/Users/master/project/demo/server/node_modules/bluebird/js/release/promise.js:614:10)
  at Promise._settlePromises (/Users/master/project/demo/server/node_modules/bluebird/js/release/promise.js:694:18)
  at _drainQueueStep (/Users/master/project/demo/server/node_modules/bluebird/js/release/async.js:138:12)
  at _drainQueue (/Users/master/project/demo/server/node_modules/bluebird/js/release/async.js:131:9)
  at Async._drainQueues (/Users/master/project/demo/server/node_modules/bluebird/js/release/async.js:147:5)
  at Immediate.Async.drainQueues [as _onImmediate] (/Users/master/project/demo/server/node_modules/bluebird/js/release/async.js:17:14)
  at processImmediate (timers.js:637:19)

Я пробовал много вещей, но не знаю, как решить Can not set headers after they are sent to the client.

Вот мои коды

/ router / api.js

const app = require('express');
const router = app.Router();

const menuController = require('../app/controllers/MenuController');

router.get('/menu/all', function(req, res, next) {
  res.send(menuController.list(req, res))
});

module.exports = router;

/ app / controllers / MenuController.js

const models = require('../models/Index');

exports.list = (req, res) => {

  const query = 'SELECT * FROM Menus';
  models.sequelize.query(query).then((data) => {
    console.log(data);
    res.send(data);
  });

};

Как мне починить мой контроллер?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы звоните res.send() дважды в своем коде.Один раз в api.js и еще раз в MenuController.js .Если вы позволите MenuController.js быть единственным, кто вызовет res.send(), у вас все будет в порядке.

Вызов res.send с аргументом подсчитывает длину отправляемых данных, создаетсписок заголовков HTTP и отправка их клиенту.Затем, когда вы вызываете res.send еще раз, ответ уже отправлен и больше невозможно изменить.

Я предполагаю, что вывод, который получает ваш клиент, теперь пуст, так как вызовmenuController.list возвращает undefined.

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