使用express.js
我有2个提供相同类型数据的API,我有一个简单的APP,我想使用第一个...如果返回错误,我想转到下一个...
我尝试的方法是使用“嵌套”:
app.get('/player/:userID', (req, res) =>
fetch('https://api1.com/api/user/' + req.params.userID + '/')
.then(function(res) {
var contentType = res.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
apiServer = 'swgohgg';
return res.json();
} else {
apiServer = 'server2';
throw ("server 1 did not reply properly");
}
})
.then(json => res.send(json))
.catch(function(err) {
console.log(err);
})
.then(function(res) {
if (apiServer == 'server2') {
fetch('https://api2.com/api/user/' + req.params.userID + '/')
.then(function(res) {
var contentType = res.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
return res.json();
}
})
.then(json => res.end(json))
.catch(function(err) {
console.log(err);
});
}
})
);
因此我将变量设置为空,如果失败,它将引发错误跳转以捕获,然后启动第二个API调用,但是当它发送res.send时,它告诉我“ TypeError:res.send不是功能”。
事情随风而逝...而我没有得到任何答复。
我尝试了一些在这里找到的其他东西,但似乎没有任何作用……有人说要更改“ res”结果,不起作用,也通过下面的要求,不起作用。 / p>
我有什么选择?
答案 0 :(得分:1)
在then
的{{1}}的最后一个res
块中,引用然后回调的参数res.send
。
应该是:
res
并且您的链接也没有达到您期望的效果。 .then(function() { // removed res here
if (apiServer == 'server2') {
捕获then? after the
捕获is call all the time, so if the code before the
发送。
does not fail then you have two
看起来像一个全局变量,但是可能有多个并发请求,那么就可以设置apiServer
,因为它会被再次读取。
代码应如下所示:
apiServer
答案 1 :(得分:0)
您在相同的上下文/范围内两次shadowing个变量,这通常是一种不好的做法。此外,您最终将使自己和他人阅读您的代码感到困惑。您可以简单地将变量的名称从res更改为response1
和response2
(只是为了给出一个主意...您可以相应地命名),以避免产生阴影。同时从第三个res
.then
app.get('/player/:userID', (req, res) =>
fetch('https://api1.com/api/user/' + req.params.userID + '/')
.then(function (response1) {
var contentType = response1.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
apiServer = 'swgohgg';
return response1.json();
} else {
apiServer = 'server2';
throw ("server 1 did not reply properly");
}
})
.then(json => res.send(json))
.catch(function (err) {
console.log(err);
})
// removed res from argument
.then(function () {
if (apiServer == 'server2') {
fetch('https://api2.com/api/user/' + req.params.userID + '/')
.then(function (response2) {
var contentType = response2.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
return response2.json();
}
})
//fixed res.end to res.send cause it was throwing an error
.then(json => res.send(json))
.catch(function (err) {
console.log(err);
});
}
})
);
希望这会有所帮助。编码愉快!