gpt4 book ai didi

node.js - 在 NodeJs 的 HTTP 请求中使用 Q promises

转载 作者:搜寻专家 更新时间:2023-10-31 23:54:42 25 4
gpt4 key购买 nike

我正在尝试使用 Kraken 框架在 NodeJS 中使用 HTTP 请求创建一个 promise 链函数。

我的代码可以在 90% 的情况下工作,但是如果远程请求的服务器需要时间来响应,代码将返回一个带有未定义值的错误。所以我认为 Q 是防止这种情况发生的一个很好的解决方案。

情况是这样的:

我们访问带有“代码”参数的 URL -> 路由 Controller 采用此参数在 HTTP POST 请求中使用它 -> 响应( token )存储在变量中并在其他 HTTP GET 中使用请求 -> 响应(多个 JSON 对象)也存储在变量中 -> 所有变量都存储在 MongoDB 中。如果函数没有按这个顺序使用,当然会失败。

var Q = require('q');

module.exports = function (router) {
router.get('/', function (req, res) {
var codein = req.param('code');
if(codein){
console.log('Provided code: ' + codein+'\n');
getAccessToken(codein).then(function(token){
console.log('Provided AccessToken: ' + token + '\n');
getUsername(token).then(function(userdata){
console.log('Provided Username: ' + JSON.parse(userdata).username + '\n');
storeData(userdata).then(function(msg){
console.log(msg);
res.redirect('/dashboard/' + JSON.parse(userdata).username);
});
});
});

}
else{
console.log('Access Denied, redirecting...');
res.redirect('/');
}
});
};

这个方法有效,但实际上并没有解决问题,因为有时候变量又是未定义的。我认为这是我的请求功能做得不好......

这是带有 POST 请求的第一个函数的示例:

var getAccessToken = function(cod){
var def = Q.defer();
var data = querystring.stringify({
client_id:"1234567890",
client_secret:"******",
grant_type:"authorization_code",
redirect_uri:"http://localhost:8000/r/callback",
code:cod
});

var options = {
host: 'domain.server.com',
port: 443,
path: '/api/oauth2/token',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(data)
}
};

var response = "";

var req = https.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
response += chunk;
});

res.on('end', function(){
var json = JSON.parse(response);
var acto = json.access_token;
def.resolve(acto);

});
});

req.write(data);
req.end();
return def.promise;

};

在这种情况下,acto 变量可以是未定义的...那么我是否以错误的方式使用了 Q?

编辑

为了理解我的问题,让我向您展示我的输出控制台中可以有什么(确实很少见但确实会发生):

Provided code: 12345678910

Provided Username: user543210

代替:

Provided code: 12345678910

Provided AccessToken: 9876543210

Provided Username: user

最佳答案

我认为你需要考虑两种情况

  1. Twitch API 需要时间来响应。
  2. 无法解析 Twitch 响应

代码

    res.on('end', function(){
var json = JSON.parse(response);
var acto = json.access_token;
def.resolve(acto);
});

应修改为:

    try {    
var json = JSON.parse(response);
var acto = json.access_token;
//check if acto is undefined
if (acto === undefined) {
def.reject('Some error message');
} else {
def.resolve(acto);
}
} catch (error) {
//since the JSON could not be parse
def.reject(error);
}

关于node.js - 在 NodeJs 的 HTTP 请求中使用 Q promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25132205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com