从React.js向Node.js API发出多个请求

时间:2019-03-19 19:43:11

标签: javascript node.js reactjs api fetch

我目前正在开发一个使用Node.js REST后端与客户端上的React.js的应用程序。

在尝试向我的API发出多个获取请求时遇到问题,导致请求停滞,这可能需要长达2分钟或更长时间才能返回数据。...我在进行单个请求时没有问题到React或Postman中的后端。

后端“ / movies / {category}”中有一个端点,该端点根据选择的类别返回电影列表。例如

/movies/horror
/movies/thriller
/movies/comedy

在我的React应用程序中,组件结构如下:

APP
-- DASHBOARD
-- -- MOVIELIST (horror)
-- -- MOVIELIST (thriller)
-- -- MOVIELIST (comedy)

在我的每个MOVIELIST组件中,我都在/ movies / {category}中进行抓取以获取数据。

如果仅加载单个MOVIELIST组件,则没有问题。但是,一旦我尝试加载多个负载,请求就会开始停止。

我已经在Chrome,FireFox和IE中进行了尝试,而这三个问题均会发生。

以下是chrome中停滞的请求的示例: enter image description here

任何帮助将不胜感激。谢谢!

-

更新:

这是我的后端设置

// index.js
const express = require('express');
const router = express.Router();

const app = express();    

const movies = require('./routes/movies');

app.use(express.json());
app.use('/api/movies', movies);

const port = process.env.PORT || 5000;    
app.listen(port, () => console.log(`Listening on port ${port}...`));

然后是电影的终点站

//movies.js
const express = require('express');
const router = express.Router();
const moment = require('moment');
const sql = require('mssql');
const _ = require('lodash');

const config = require('../config/config');

//For CORS
router.options('/*', (req, res) => {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
    res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']).send();
});

router.get('/horror', auth, (req, res) => {
sql.connect(config).then(pool => {
        return pool.request().query(
            `SELECT STATEMENT`
        );
    }).then(result => {    
        sql.close();
        res.header('Access-Control-Allow-Origin', "*");
        res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
        res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']);
        return res.send(result);    
    }).catch(err => {
        sql.close();
        res.header('Access-Control-Allow-Origin', "*");
        res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
        res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']); 
        return res.send(err);
    });
})

router.get('/thriller', auth, (req, res) => {
    sql.connect(config).then(pool => {
            return pool.request().query(
                `SELECT STATEMENT`
            );
        }).then(result => {           
            sql.close();
            res.header('Access-Control-Allow-Origin', "*");
            res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
            res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']);
            return res.send(result);        
        }).catch(err => {
            sql.close();
            res.header('Access-Control-Allow-Origin', "*");
            res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
            res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']); 
            return res.send(err);
        });
    })

router.get('/comedy', auth, (req, res) => {
    sql.connect(config).then(pool => {
            return pool.request().query(
                `SELECT STATEMENT`
            );
        }).then(result => {        
            sql.close();
            res.header('Access-Control-Allow-Origin', "*");
            res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
            res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']);
            return res.send(result);        
        }).catch(err => {
            sql.close();
            res.header('Access-Control-Allow-Origin', "*");
            res.header('Access-Control-Allow-Methods', "GET, POST, PUT");
            res.header('Access-Control-Allow-Headers', ['Content-Type', 'x-access-token']); 
            return res.send(err);
        });
    })

module.exports = router;

2 个答案:

答案 0 :(得分:1)

我是新来的开发人员,所以您可能不太重视我所说的话。

我认为您在获取数据时做的太多了。您可以获取仪表板中的所有电影,但要确保所有电影都具有类别,然后使用单个终结点根据传入类别名称作为查询的类别来获取电影。

在仪表板上,有一个getAllMovies端点-content = content.replace (u"\v", "") content = content.replace (u"\x0b", "") content = content.replace (u"\f", "") content = content.replace (u"\x0c", "") content = content.replace (u"\x1c", "") content = content.replace (u"\x1d", "") content = content.replace (u"\x1e", "") content = content.replace (u"\x85", "") content = content.replace (u"\u2029", "") content = content.replace (u"\u2028", "") content = content.replace (u"\u001D", "") -,该端点将在Home / Dashboard组件渲染时获取所有电影。

侧边栏/导航中的每个类别都有三个链接/按钮。创建单个端点-/movies/getAllMovies,为您感兴趣的每个类别将类别名称作为查询传递给端点并获取。

就像@SakoBu所说的那样,将其放在github上并共享链接。

编辑:有一个可用于cors的npm软件包,它将为您节省大量的击键次数,并使您的代码更具可读性。

https://github.com/expressjs/cors

答案 1 :(得分:0)

通过在后端使用async / await解决了此问题。

router.get('/thriller', auth, (req, res) => {

     await getThrillers().then(result => {
        res.send(result);
    }).catch(err => {
        console.log(err)
    });

})

async function getThrillers(){   

    let promise = new sql.ConnectionPool(config).connect().then(pool => {
        return pool.request().query(`SELECT STATEMENT`)
    }).catch(error => {
        return error
    });

    let result = await promise;        

    return result;

}