Javascript Node JS Express如果向第三方API发出错误请求,如何发送404错误?

Javascript Node JS Express如果向第三方API发出错误请求,如何发送404错误?,javascript,node.js,express,error-handling,http-status-code-404,Javascript,Node.js,Express,Error Handling,Http Status Code 404,在我的Node JS服务器中,我有一个路由处理程序,它向第三方API发送请求以获取用户名: app.get('/players/:player', apiLimiter, function(request, response) { const player = request.params.player; const api_url = `https://api.com/shards/steam/players?filter[playerNames]=${player}`; var opti

在我的Node JS服务器中,我有一个路由处理程序,它向第三方API发送请求以获取用户名:

app.get('/players/:player', apiLimiter, function(request, response) {

const player = request.params.player;
const api_url = `https://api.com/shards/steam/players?filter[playerNames]=${player}`;

var options = {
   method: "GET",
   observe: 'body',     
   };

   let apiRequest = https.request(api_url, options, function (res) {

    let data = "";

    res.on("data", chunk => {
        data += chunk;
    }) 

    res.on("end", () => { 

           let objectParsed =  JSON.parse(JSON.stringify(data)); 
           response.send(objectParsed);               
    }) 

  if(!player) {
  res.status(404).send("Not found.");
}


})
apiRequest.end();

}) 
这可以很好地获取存在的用户。但是,如果我在我的/玩家页面中输入了一个假用户名,该页面仍然会加载200状态,而不是404响应。页面加载后看起来已损坏,因为它实际上没有从API获取任何数据

我觉得这是个愚蠢的问题。。在我的研究中,我发现如果只是路由,而不是像/players/:player那样依赖于路径参数的路由,那么如何处理错误

我发现了一个类似于我的问题,我尝试使用If语句:If!玩家{res.status404.send未找到。}但没有骰子。我是否在错误的地方使用了这个if语句


如果数据库中的用户不存在,我如何让我的节点JS服务器响应404

您必须检查API调用的结果,看看是否返回了有效数据并将404发送到那里。我还添加了一个检查,以确保玩家名称已通过,如果根本没有指定玩家,则返回400个错误请求:

app.get('/players/:player', apiLimiter, function(request, response) {

    const player = request.params.player;
    if (!player) {
        res.status(400).send("No player specified.");
        return;
    }

    const api_url = `https://api.com/shards/steam/players?filter[playerNames]=${player}`;

    var options = {
        method: "GET",
        observe: 'body',
    };

    let apiRequest = https.request(api_url, options, function(res) {

        let data = "";

        res.on("data", chunk => {
            data += chunk;
        })

        res.on("end", () => {

            let objectParsed = JSON.parse(data);
            // test objectParsed here
            if (!some condition in objectParsed) {
                res.status(404).send("No data for that player name.");
            } else {
                response.send(objectParsed);
            }
        });
    });
    apiRequest.end();
});
此外,这里不需要JSON.parseJSON.stringifydata。您的数据已经是一个字符串。只需执行JSON.parsedata

仅供参考,如果您使用一个小型http请求库,例如,此代码会变得简单得多,因为它会在一行代码中累积响应并解析JSON,如下所示:

let data = await got(options).json()

它是按照代码工作的。乍一看,您已经为变量指定了player的值,但是您没有检查该player是否可用。这就是为什么在get请求中该值仍然保持不变,并且您没有得到404错误。因为你只是在检查!但根据您的代码,您将始终获得播放器。当您输入假名时,request.params.player实际上包含什么内容?正如@JuhilSomaiya所说,即使这是一个错误,它仍然可能在request.params.player中返回某种值。所以当你和我核对的时候!它仍然会返回真值。因此,除非该值为空、null或false,否则它将返回true。谢谢!现在肯定觉得自己是个愚蠢的问题,但我有点接近我,也许不是太多。我最终使用if objectParsed.includes'errors'{response.status404.sendNo该播放器名的数据。}使其工作如果从第三方api的数据库中找不到用户,则此情况下的“错误”是从第三方api发送的响应。再次感谢!