如果向第三方 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()
在我的 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 (!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()