在我的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中获得任何数据。
我觉得这是个愚蠢的问题..在我的研究中,我发现了如何处理错误,如果它仅仅是路由,而不是依赖于路径参数的路由,如/player/:player
我发现了一个与我的问题(How to throw a 404 error in express.js?)类似的问题,并尝试使用If语句:if (!player){res.status(404).send("Not found."); }
,但没有骰子。我在错误的地方使用了这个if语句吗?
如果数据库中的用户不存在,我如何让Node JS服务器响应404?
发布于 2020-02-06 13:04:39
您必须检查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()
https://stackoverflow.com/questions/60086767
复制相似问题