尝试使用express中间件服务第三方API请求
很抱歉,如果我发布的不正确,这是我关于堆栈溢出的第一个问题。我目前正在尝试使用express向我的React前端提供第三方API请求。这是因为我使用的steam api在客户端请求时抛出了一个CORS错误。我试图将请求路由到我的控制器,该控制器发出axios调用,但我没有成功。不确定我是否做了完全错误的事情 这是我的server.js尝试使用express中间件服务第三方API请求,express,cors,axios,Express,Cors,Axios,很抱歉,如果我发布的不正确,这是我关于堆栈溢出的第一个问题。我目前正在尝试使用express向我的React前端提供第三方API请求。这是因为我使用的steam api在客户端请求时抛出了一个CORS错误。我试图将请求路由到我的控制器,该控制器发出axios调用,但我没有成功。不确定我是否做了完全错误的事情 这是我的server.js const app = require('./app.js'); const PORT = process.env.PORT || 3005;
const app = require('./app.js');
const PORT = process.env.PORT || 3005;
app.listen(PORT, () => console.log(`Listening on port: ${PORT}`))
这是我的app.js
const express = require('express');
const cors = require('cors')
const app = express();
app.use(cors())
module.exports = app
我的路线:
const { Router } = require('express')
const controllers = require('../controllers')
const router = Router()
router.get('/', (req, res) => res.send('This is root!'))
router.get('/applist', controllers.getAllSteamGames)
router.get('/game/:id', controllers.getSingleGameSteam )
router.get('/gameSpy/:id', controllers.getSingleGameSpy)
module.exports = router
最后,我的控制器:
const axios = require('axios');
const getAllSteamGames = async () => {
try {
const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist')
return resp.data
} catch (error) {
console.log(error)
throw error
}
}
谢谢你的帮助和时间 您没有做任何事情将响应发送回客户端。如果我们查看
/applist
路线:
router.get('/applist', controllers.getAllSteamGames)
const axios = require('axios');
const getAllSteamGames = async () => {
try {
const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist');
return resp.data
} catch (error) {
console.log(error)
throw error
}
}
总之,getAllSteamGames()
函数只返回解析为值的承诺(记住所有async
函数都返回承诺)。它不会将响应发送回客户端
然后,如果您查看实际的路由处理程序,它也不会将响应发送回客户端。因此,您收到请求,但从未发送响应。客户端从未得到响应
我建议您只需在控制器中发送响应。它已经作为参数传递给函数,以便您可以使用它们
router.get('/applist', controllers.getAllSteamGames)
const axios = require('axios');
const getAllSteamGames = async (req, res) => {
try {
const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist');
res.json(resp.data);
} catch (error) {
// send error status upon error
console.log(error);
res.sendStatus(500);
}
}
啊,我明白你的意思了。我认为您可以从axios调用返回响应,而它隐式地是控制器的响应。我会尝试解决这个问题,谢谢你的帮助。@philipryan-你的控制器只是一个普通的Javascript对象,你可能会把它当作代码建议。它根本没有特殊的功能——它只是一种组织请求处理函数的方法。代码中的某些内容必须返回响应。如果这回答了您的问题,那么您可以通过单击答案左侧的复选标记向社区表明这一点,并通过在此处遵循正确的程序为自己赢得一些声誉点数。更新:是!它成功了,非常感谢。尝试将循环结构转换为json时,我遇到了一个类型错误。我把resp改为resp.data,它成功了。