javascript - 在 express 上使用 axios 挂起呼叫
问题描述
我正在尝试使用带有 express 的 axios 对 api 进行非常简单的调用,但不知道为什么它总是在浏览器上挂起
这是我的路线
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.log(res.data))
.catch(err => console.log("Axios err: ", err));
}
这是 app.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 到 await/async 并且不知道我做错了什么。当我将路由和控制器放在同一个文件上时,它正在工作。请问有人给点小费吗?
解决方案
我相信问题出在控制器上。由于您从未运行res
变量函数(只需定义它),因此没有任何反应,并且由于没有发回响应......它挂起。
exports.getAllIssues = (req, res) => {
axios.get(url)
.then(axRes => {
console.log(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
推荐阅读
- python - 表单中的 Django JSON 字段
- git - 在 Docker 构建期间使用 git 子模块
- memory-management - 使用 procdump 进行转储时,进程的内存使用量会增加。这甚至可能吗?
- java - 掷骰子的 Java 方法每次都返回“双倍”
- html - 将样式应用于放置在另一个表中的特定子表
- python - 如果输入的重量不在列表中,我如何使它不出现错误(索引错误)
- c++ - 通过指针或引用将映射传递给函数?
- java - 是否有可用于在 Javadoc 中嵌入 Graphviz DOT 代码的 doclet?
- javascript - 检查对提示的响应是否为某个字符串
- sql - 如何制作案例陈述并忽略用户的输入 postgres