节点没有在请求中执行请求?

时间:2015-10-14 05:59:58

标签: javascript node.js express loopbackjs

我尝试运行此代码:

app.delete('/closeTrelloBoard', function (req, res) {
    console.log('[data], [...]');
    var options = {
        method: 'GET',
        url: 'https://api.trello.com/1/members/someId/boards?key=KEY&token=TOKEN'
    };

    request(options, function (error, body) {
        var boards = JSON.parse(body.body);

        for (var i=0; i<boards.length; i++) {
            console.log(boards[i].id);  //This line runs
            app.put('/closeTrelloBoard',function (req, res) {

                var options = {
                    method: 'PUT',
                    url: 'https://api.trello.com/1/boards/'+boards[i].id+'/closed?key=KEY&token=TOKEN&value=true',
                };

                request(options, function (error,body) {
                    console.log('Board closed');  //But this line not runs
                });
            });
        };

    });
});

在上面的代码中,我试图在另一个请求回调中发出请求。问题是,第一个请求给了我正确的答复,但第二个请求没有给我任何输出。

请指导我为什么第二次请求没有运行。

2 个答案:

答案 0 :(得分:0)

您的第二个请求是在app.put()方法的回调中设置的。这意味着只有在调用/closeTrelloBoard路由时才会触发请求(在回调中设置路由似乎不是逻辑,更糟糕的是 - 在循环中)。因此,为了在第一次完成后运行第二个请求,请在app.put()方法之前调用它。我不知道你的意图,我可能会弄错,但我想app.put()应该设置在代码的其他地方。

app.delete('/closeTrelloBoard', function (req, res) {
console.log('[data], [...]');
var options = {
    method: 'GET',
    url: 'https://api.trello.com/1/members/someId/boards?key=KEY&token=TOKEN'
};

request(options, function (error, body) {
    var boards = JSON.parse(body.body);

    for (var i=0; i<boards.length; i++) {
        console.log(boards[i].id);  //This line runs
        var options = {
            method: 'PUT',
            url: 'https://api.trello.com/1/boards/'+boards[i].id+'/closed?key=KEY&token=TOKEN&value=true',
        };

        request(options, function (error,body) {
            console.log('Board closed');  //But this line not runs
        });

    };
    app.put('/closeTrelloBoard',function (req, res) {


    });
});

});

答案 1 :(得分:0)

好的,所以,我真的不明白你要做什么......通过标签我可以看到你正在使用ExpressJS,所以&#34; app&#34;是他的主要变量的惯例......

现在,我可以从代码中读到的是: 您正在注册&#34; DELETE&#34;方法到&#34; / closeTrelloBoard&#34;然后,你创建了一个名为&#34; options&#34;的对象。传递给请求,然后你发出请求......好吧,现在你从请求的主体解析de JSON并且......做一个循环来发出请求......好吧这是我看到的第一个,尝试使用Callbacks而不是循环,因为是Node的强大功能。我们继续吧。现在......我不明白,你正在注册,&#34; PUT&#34; &#34; / closeTrelloBoard&#34; ...的方法我认为这不是必须的.​​.....然后你提出循环的请求......

让我们看看这是否可行,这应该是&#34; NodeJS方式&#34;,如果你有疑问就问问他们:)我不记得这些回调方法是如何调用的,但我记得他们有自己的名字,我也没有尝试过,所以......它无法运作:

app.delete('/closeTrelloBoard', function (req, res) {
    console.log('[data], [...]');
    var options = {
        method: 'GET',
        url: 'https://api.trello.com/1/members/someId/boards?key=KEY&token=TOKEN'
    };

    request(options, function (error, body) {
        var boards = JSON.parse(body.body);

        loopEveryBoard = function(i, next){
            if (i >= boards.length){
                next()
            } else {
                var options = {
                    method: 'PUT',
                    url: 'https://api.trello.com/1/boards/'+boards[i].id+'/closed?key=KEY&token=TOKEN&value=true',
                };

                request(options, function (error,body) {
                    console.log('Board ' + i + ' closed');  //But this line not runs
                    loopEveryBoard(++i, next); // The ++ has to be on the left to make it effective before the function takes the value
                });
            }
        }

        loopEveryBoard(0, function(){
            console.log('Every board closed');
        });

    });
});