Node.JS возвращает 404 при опросе конечной точки, которая действительно существует - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть веб-приложение, созданное предыдущей компанией, написанное на Angular.JS.
Приложение предоставляет запрос на сервер (написанный на Node.JS + Express), чтобы собрать некоторые данные, необходимые для заполнения таблицы.
В частности, это запрос, который приложение отправляет каждый раз, когда пользователь входит на страницу, содержащую таблицу (переменная config содержит маркер доступа).

return $http.get(API + '/api/myPath/for/Having/Data', config).then(handleSuccess, handleError);

handleSuccess и handleError так определены

        handleSuccess: function (res) {
            debugger;
            var deferred = $q.defer();
            res.data.success ? deferred.resolve(res.data) : deferred.reject(res.data.message);
            return deferred.promise;
        },

        handleError: function (error) {
            return {
                success: false,
                message: error
            };
        }

В моем бэк-энде я поставил слушателя все, что вызывается с префиксом "/ api", например так

app.use('/api', authorization.validateToken);

И еще один слушатель, который должен работать только при отсутствии совпадений (записывается в самом конце файла, который обрабатывает все общие запросы приложения)

app.all('*', (req, res) => {
    console.log('Hi, Stack Overflow!');
    res.send({
        success: false,
        status: 404,
        message: 'Invalid Uri Resource'
    });
});

И, наконец, это конечная точка, которую следует вызывать в бэк-энде из Angular.js

app.get('/api/myPath/for/Having/Data', something.somethingToCall);

Вот забавная часть: по причине, которую я все еще должен понять, Angular.JS вызывает этоконечная точка дважды, что приводит к одной неудачной процедуре (404) и другой, которая проходит гладко (200).
Поток операций должен выглядеть следующим образом: Angular вызывает back-end -> Node проверяет действительность токена -> выполняет операцию, если все идет хорошо.
Операция вызывается дважды (это видно благодаря отладчику кода Visual Studio и сетевому монитору Chrome), и, хотя процесс проверки токена выполняется правильно каждый раз, в первый раз функция next () будет удерживать app.all (слушатель.
Кроме того, даже до того, как я начну отлаживать первый отправленный запрос, консоль JavaScript в Google Chrome предупреждает меня о том, что произошла ошибка, например «Не удается прочитать свойство« данные »из неопределенного» », что означает, что запросисполняется дважды, когда в первый раз возвращается 404.

exports.validateToken = (req, res, next) => {
    console.log(`check user here`);
    // next();
    var token =  //I take the token 
    console.log(token);
    if (token) {
        jwt.verify(token, require('../../secret'), (err, decoded) => {
            if (err) {
                res.send({
                    success: false,
                    status: 500,
                    tokenExpired: true,
                    message: "Effettua nuovamente l'accesso"
                });
            } else {
                req.decoded = decoded;
                next();
            }
        });
    } else {
        res.send({
            success: false,
            status: 406, // Fprbidden
            message: 'User not Authenticated'
        });
    }
};

Кто-нибудь знает, как мне помочь?РЕДАКТИРОВАТЬ: это пример того, как Chrome видит оба запроса.Снимок экрана, в частности, относится к первому, который вызывается и производит 404

. CORS обрабатывается в серверной части следующим образом:

app.use(function (req, res, next) {

    if (req.headers.origin && (req.headers.origin.match("http:\/\/somewebsite.com.*") || req.headers.origin.match("http:\/\/localhost:8010") )) {
        res.header("Access-Control-Allow-Origin", req.headers.origin);
    }

    next();
});

Также я добавляюконечная точка, которая должна быть вызвана.Это также использует MongoDB + Mongoose для запроса базы данных и возврата материала во внешний интерфейс.Параметры, которые я передаю: pageSize (количество элементов на странице) и номер текущей страницы

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

  var criteria = req.body || {};
  var pageSize = criteria['pageSize'] ? Number(criteria['pageSize']) : undefined;
  var pageNumber = criteria['pageNumber'] ? Number(criteria['pageNumber']) : undefined;

  var sort = criteria.sort || { createdAt: 'desc' };

  if (criteria.customerName) criteria.customerName = { $regex: `.*${criteria.customerName}.*`, $options: 'i' };
  if (criteria.spentEuros) criteria.spentEuros.$gte = criteria.spentEuros;
  if (criteria.referralMail) criteria.referralMail = { $regex: `.*${criteria.referralMail}.*`, $options: 'i' };


  console.log(criteria);

  var columns = "customerName duration spentEuros";

  if (pageSize && pageNumber) {
    Adv.paginate(criteria, {
      page: pageNumber,
      limit: pageSize,
      select: columns,
      sort: sort
    }, function (err, result) {
      if (!err) res.status(200).send({ success: true, data: result });
      else res.status(500).send({ success: false, message: err });
    });
  } else {
    Adv.find(criteria)
      .select(columns)
      .sort(sort)
      .exec(function (err, result) {
        if (!err) res.status(200).send({ success: true, data: result });
        else res.status(500).send({ success: false, message: err });
      });
  }

};

EDIT2: решение вопроса: добавление слушателя app.options в бэкэнд (как@slebetman), наряду с уже существующим app.get, решил проблему

The first endpoint call that produces the 404

1 Ответ

0 голосов
/ 29 декабря 2018

Вот забавная часть: по причине, которую я все еще должен понять, Angular.JS вызывает эту конечную точку дважды ...

Это похоже на то, что браузер отправляет CORS предварительный запрос OPTIONS, за которым следует GET.Проверьте используемый HTTP-глагол и убедитесь, что вы обрабатываете OPTIONS (а не только GET), если вам нужна поддержка CORS на вашей конечной точке.(Если вы не ожидаете, что это будет запрос с несколькими источниками, проверьте источник страницы относительно источника вызова API, что-то [протокол, порт, домен] кажется другим - , если это OPTIONS звонок.)

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