我如何同时处理两个查询并解决此错误?

问题描述 投票:0回答:1

我遇到了一些麻烦,我试图找出我的代码出了什么问题,但我很快就提出了。

我试图实现的是能够在node.js中使用一个或两个查询。不幸的是,我无法同时使用两者。当我使用流派时,它不会排序,但是排序似乎确实可以单独工作。使用流派似乎还会引起异步问题?我查看了其他一些问题,但它们似乎与我的问题并不相似,因为我仅使用get和send。

const express = require('express');
const morgan = require('morgan');
const cors = require('cors');
const playstore = require('./playstore.js');

const app = express();

app.use(morgan('common'));
app.use(cors());

app.get('/apps', (req, res) => {
    const { genres, sort } = req.query;
    let playstoreG = null;
    const GENRELIST = [
        'Action',
        'Puzzle',
        'Strategy',
        'Casual',
        'Arcade',
        'Card',
    ];

    if (sort) {
        if (!['Rating', 'App'].includes(sort)) {
            res.status(400);
            res.send('Sort selection must be app or rating.');
        } else {
            playstore.sort((a, b) =>
                a[sort] < b[sort] ? -1 : a[sort] > b[sort] ? 1 : 0
            );
        }
    }

    if (genres) {
        if (!GENRELIST.includes(genres)) {
            res.status(400);
            res.send('Apps in this genre not found.');
        } else {
            playstoreG = playstore.filter(
                (q) => q.Genres.toLowerCase() === genres.toLowerCase()
            );
        }
    }

    let results = '';
    if (playstoreG === 0 || playstoreG === null) {
        results = playstore;
    } else {
        results = playstoreG;
    }
    res.json(results);
});

app.listen(5000, () => {
    console.log('Server is live on PORT 5000!');
});

出于任何原因,如果我同时使用这两个,我会收到一个异步问题,我相信吗?

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (C:\Users\*\vsc\gpsServer\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Users\*\vsc\gpsServer\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\*\vsc\gpsServer\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\Users\*\vsc\gpsServer\node_modules\express\lib\response.js:158:21)
    at C:\Users\*\vsc\gpsServer\app.js:38:28
    at Layer.handle [as handle_request] (C:\Users\*\vsc\gpsServer\node_modules\express\lib\router\layer.js:95:5)        
    at next (C:\Users\*\vsc\gpsServer\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\*\vsc\gpsServer\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\*\vsc\gpsServer\node_modules\expres

我正在使用的一些数据。

module.exports = [
{
    'App': 'ROBLOX',
    'Category': 'GAME',
    'Rating': 4.5,
    'Reviews': '4447388',
    'Size': '67M',
    'Installs': '100,000,000+',
    'Type': 'Free',
    'Price': '0',
    'Content Rating': 'Everyone 10+',
    'Genres': 'Adventure;Action & Adventure',
    'Last Updated': 'July 31, 2018',
    'Current Ver': '2.347.225742',
    'Android Ver': '4.1 and up',
},
{
    'App': 'Subway Surfers',
    'Category': 'GAME',
    'Rating': 4.5,
    'Reviews': '27722264',
    'Size': '76M',
    'Installs': '1,000,000,000+',
    'Type': 'Free',
    'Price': '0',
    'Content Rating': 'Everyone 10+',
    'Genres': 'Arcade',
    'Last Updated': 'July 12, 2018',
    'Current Ver': '1.90.0',
    'Android Ver': '4.1 and up',
},

谢谢您的时间!

javascript node.js express
1个回答
0
投票

这不是异步问题。

在处理genres时,您正在发送400错误或有效负载。

在处理sort时,您正在发送400错误或有效负载。

您应该只发送一个有效载荷-首先过滤类型(如果需要),然后进行排序(如果请求),然后发送有效载荷。

您看到的错误是因为您已经发送了genres的有效负载,然后又到达了sort,但是存在某种错误,因此您尝试发送400,但是不能因为您已经通过在类型逻辑中发送有效内容来提交了标头。

© www.soinside.com 2019 - 2024. All rights reserved.