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

Node JS Express how can I send a 404 error if a bad request is made to third party API?

在我的 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

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

如果数据库中的用户不存在,我如何让我的 Node 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.parse(JSON.stringify(data)) 出现在此处。您的数据已经是一个字符串。就做 JSON.parse(data).

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

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