【问题标题】:Node JS Express how can I send a 404 error if a bad request is made to third party API?如果向第三方 API 发出错误请求,Node JS Express 如何发送 404 错误?
【发布时间】:2020-05-22 00:22:00
【问题描述】:

在我的 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();

}) 

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

我觉得这是一个愚蠢的问题.. 在我的研究中,我发现如果它只是路径,而不是依赖于路径参数的路径,例如 /players/:player ,如何处理错误

我发现了一个与我的问题相似的问题 (How to throw a 404 error in express.js?),我尝试使用 If 语句:if (!player){res.status(404).send("Not found."); } 但没有骰子。我在错误的地方使用了这个 if 语句吗?

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

【问题讨论】:

  • 它按照代码工作。乍一看,您已经将 player 的值分配给了变量,但是您没有在任何地方检查该播放器是否可用。这就是为什么值仍然通过 get 请求而您没有收到 404 错误的原因。因为您只检查!player,但根据您的代码,您将始终获得播放器。
  • 当您输入假名时,request.params.player 实际包含什么?正如@JuhilSomaiya 所说,即使这是一个错误,它仍可能在request.params.player 中返回某种值。因此,当您检查 !player 时,它仍然会返回 true。因此,除非该值为空、null 或 false,否则它将返回 true。

标签: javascript node.js express error-handling http-status-code-404


【解决方案1】:

您必须检查 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.parse(JSON.stringify(data))。您的数据已经是一个字符串。只需JSON.parse(data)

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

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

【讨论】:

  • 谢谢!现在绝对感觉像是一个愚蠢的问题,但我几乎接近(嗯,也许不是太多)。我最终使用if ( objectParsed.includes('errors') ) { response.status(404).send("No data for that player name."); } 让它工作。如果从他们的数据库中找不到用户,则在这种情况下,“错误”是从第三方 api 发送的响应。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2016-06-22
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多