Javascript Node JS Express如果向第三方API发出错误请求,如何发送404错误?
在我的Node JS服务器中,我有一个路由处理程序,它向第三方API发送请求以获取用户名: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
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发送的响应。再次感谢!