У меня есть веб-приложение, созданное предыдущей компанией, написанное на 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](https://i.stack.imgur.com/D5F9C.png)