ECONNREFUSED при выполнении запроса GET в приложении, но API успешно возвращает JSON

Я пишу приложение node с React, используя node-postgres и superagent для внутренних вызовов. Допустим, я делаю запрос GET и использую JSON, который он возвращает, чтобы заполнить таблицу студентов. Мой API выглядит так:

import pg from 'pg';
import Router from 'express';
let router = new Router();
let conString = "postgres://user:pass@localhost/db_name";

router.get('/getStudents', function(req, res) {
  var results = [];

    pg.connect(conString, function(err, client, done) {
      if (err) {
       done();
       console.log(err);
       return res.status(500).json({success: false, data: err});
    }

    var query = client.query('SELECT first_name, last_name, email FROM students');

    query.on('row', function(row) {
      results.push(row);
    });

    query.on('end', function() {
      done();
      return res.json(results);
    });
  });
});

При загрузке страницы это вызывается из хранилища для установки массива студентов. Кажется, здесь что-то идет не так:

var request = require('super agent');

function getStudents() {
   request
     .get('/api/getStudents')
     .set('Accept', 'application/json')
     .end(function(err, res) {
       if (err) {
         console.log("There's been an error: getting students.");
         console.log(err);
       } else {
         return res;
       }
     });
 }

Если я сверну localhost:3000/api/getStudents, я получу ожидаемый ответ JSON.

Однако, когда я вызываю это при загрузке страницы, я получаю ошибку ECONNREFUSED:

Error: connect ECONNREFUSED 127.0.0.1:80]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 80,
response: undefined

Не уверен, почему я получаю сообщение об ошибке на порту HTTP. Я впервые использую node-postgres, superagent и React, поэтому любая помощь приветствуется.

Изменить: Забыл упомянуть, что я могу делать POST-запросы и вставлять элементы в базу данных без каких-либо ошибок. Эта ошибка возникает только тогда, когда я пытаюсь выполнить запрос GET.


person johnprisco    schedule 08.12.2015    source источник
comment
Вы открыли порт 80? Похоже, что суперагент по умолчанию имеет значение localhost:80, если только вы не укажете хост и порт и не хотите, чтобы порт был 3000.   -  person Quy    schedule 08.12.2015
comment
Ты знаешь, как это сделать, @Quy? Я не могу найти документацию или примеры настройки порта с помощью суперагента. Я пробовал .set('port', 5432) и .set('port', 3000), но пока безуспешно. Спасибо за предложение.   -  person johnprisco    schedule 10.12.2015
comment
попробуй request.get('http://localhost:3000/api/getStudents')   -  person Quy    schedule 11.12.2015


Ответы (2)


Попробуйте это (вставив полный URL-адрес пути) в методе get:

request
  .get('http://localhost:3000/api/getStudents')
  .set('Accept', 'application/json')
  .end(function(err, res) {
    if (err) {
      console.log("There's been an error: getting students.");
      console.log(err);
    } else {
      return res;
    }
  });

Ознакомьтесь с документацией для CORS для примера использования абсолютных URL-адресов:

https://visionmedia.github.io/superagent/#cors

person Quy    schedule 11.12.2015
comment
Спасибо, это сработало с тем, как я это реализовал. Неудивительно, что я не придерживался лучших практик React, поэтому провел некоторый рефакторинг, и все заработало без полного URL-адреса. Спасибо за вашу помощь! - person johnprisco; 11.12.2015

Ошибка также возникает, если у вас нет протокола в URL-адресе вашего запроса.

Вместо

request.get('www.myexample.com/api/getStudents')

do

request.get('https://www.myexample.com/api/getStudents')
             ^^^^^^^^
person Kim Kern    schedule 04.01.2019