首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node JS Express如果向第三方API发出了错误的请求,如何发送404错误?

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

Stack Overflow用户
提问于 2020-02-06 10:10:33
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
运行
复制
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中获得任何数据。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-06 13:04:39

您必须检查API调用的结果,看看是否获得了有效的数据,并将404发送到那里。我还添加了一个检查,以确保为球员名称传递了一些内容,如果根本没有指定球员,则返回一个400 (错误请求):

代码语言:javascript
运行
复制
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,如下所示:

代码语言:javascript
运行
复制
let data = await got(options).json()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60086767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档