Я пытаюсь сделать очень простой вызов API, используя axios с экспрессом, и понятия не имею, почему он всегда находится в ожидании в браузере.
это мой маршрут
var express = require("express");
var router = express.Router();
const controller = require("../../controllers/issues.controller");
/* GET ALL ISSUES */
router
.route('/')
.get(controller.getAllIssues);
это мой контроллер
var axios = require("axios");
const url = "https://redmine-mock-api.herokuapp.com/api/v1/issues?after=2019-04-13T12:00";
exports.getAllIssues = () => {
const res = axios.get(url)
.then(res => console.info(res.data))
.catch(err => console.info("Axios err: ", err));
}
Это приложение.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./src/api/routes/v1/index');
var usersRouter = require('./src/api/routes/v1/users');
var issuesRouter = require('./src/api/routes/v1/issues');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/v1/users', usersRouter);
app.use('/v1/issues', issuesRouter);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
В браузере он всегда находится в ожидании, и я уже пытаюсь с .then ожидать/асинхронно и понятия не имею, что я делаю неправильно. Когда у меня был маршрут и контроллер в одном файле, он работал. У кого-нибудь есть совет, пожалуйста?
Большое вам спасибо!` ``` exports.getAllIssues = async (req, res) => { try { const { data } = await axios.get (url) res.json (data) } catch (err) { console. error('Ошибка Axios:', err) } } ``` выглядит так и работает!
Думаю проблема в контроллере. Поскольку вы никогда не запускаете функцию переменной res
(просто определяете ее), ничего не происходит, и поскольку ответ не отправляется обратно... он зависает.
exports.getAllIssues = (req, res) => {
axios.get(url)
.then(axRes => {
console.info(axRes.data)
// this below line is what closes the loop on waiting for the controller
res.json(axRes.data);
})
.catch(res.json);
}
Асинхронный подход выглядел бы очень похоже
exports.getAllIssues = async (req, res) => {
try {
const axRes = await axios.get(url);
res.json(axRes.data);
} catch(err) {
res.send(err);
}
}
Вы можете прочитать о различных экспресс-методах res.send
и т. д. здесь http://expressjs.com/en/api.html#res.json
Вот и все! Большое спасибо! обновлено для асинхронного/ожидающего использования. Спасибо!
классно! если у вас есть секунда, чтобы отметить ответ как правильный, я был бы признателен
getAllIssues
должен принимать два параметраrequest
иresponse
, как только вы закончите с получением своих задач, прикрепите его кresponse
объекту иresponse.send()
к клиенту.