【问题标题】:Trying to use express middleware to serve third party API requests尝试使用 express 中间件来服务第三方 API 请求
【发布时间】:2020-05-24 16:55:16
【问题描述】:

对不起,如果我不正确地发布了这个,这是我在 Stack Overflow 上的第一个问题。我目前正在尝试使用 express 向我的 React 前端提供第三方 API 请求。这是因为我使用的 steam api 在客户端请求时会引发 CORS 错误。我试图将请求路由到进行 axios 调用的控制器,但我没有运气。不确定我是否在做完全不正确的事情。

这是我的 server.js

    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
        }
    }

感谢您的帮助和时间。

【问题讨论】:

    标签: express cors axios


    【解决方案1】:

    您没有做任何事情来将响应发送回客户端。如果我们查看/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 函数都返回一个承诺)。它不会向客户端发送回响应。

    然后,如果您查看实际的路由处理程序,它也不会将响应发送回客户端。因此,您收到请求并且从不发送响应。客户端永远不会得到响应。

    我的建议是您只需在控制器中发送响应即可。它已经将 (req, res) 作为参数传递给函数,因此您可以使用它们。

    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 并且它起作用了。
    猜你喜欢
    • 2022-11-29
    • 1970-01-01
    • 2020-06-27
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2020-11-08
    相关资源
    最近更新 更多