zer09
zer09

Reputation: 1586

Unable to send request from request callback

I cant execute a second request inside the request callback.

request({
    url: url,
    headers: {
        'auth-token': token
    },
    method: 'POST',
    json: true,
    body: data
}, (err, req, body) => {
    if (err) {
        console.log(err);
    } else {
        // Prosses data;

        // This is the second request.
        request({
            url: url2,
            headers; {
                'auth-token': token
            },
            method: 'POST',
            json: true,
            body: data2
        }, (err, req, body) => {
            if (err) {
                console.log(err);
                return;
            }

            //Process data.
        })
    }
})

The problem is that the second request is not executing. I am using nodemon to start the express server, but on the nodemon only the first request is receive on the express.

But the strange thing is that when I tried to call the method on the second time without closing the electron app, the second request is executed. And I can see it on the nodemon that the second request is executed first.

The output of the nodemon is like this.

POST /path/to/url 200 6.181 ms - 641 //-> this is the first execution. then there is nothing follows.
// Then I call the method again using the app. And the result is this.
POST /path/to/second/url 200 9.645 ms - 21
POST /path/to/url 200 21.628 - 641

It look like the /path/to/second/url is staying on somewhere nowhere and just send to the server if the method is called for the second time.

Please help, thanks.

Update: Added more info.

I have a folder could routes all the .js file is save there. then I am loading it using this on the my app.js

let rs = fs.readdirSync(path.join(process.cwd(), '/routes/'));
rs.forEach((file) => {
    if (file.indexOf('.js') !== -1) {
        let fn = '/' + file.replace(/\.[^/.]+$/, '');
        let pt = path.join(__dirname, './routes', fn);
        let req = require(pt);
        app.use(fn, req);
    }
});

Then on the routes files I have something similar like this.

router.post('url', (req, res) => {
  // here calling the controller. 
  // mostly just single line passing the request and result variable to the controller.
});

Actually that requests is called inside the ipc callback. I have a menuitems and on the click() event I just used the browserWindow.getFocusedWindow().webContents.send('ipc-name') then this will be triggered.

  ipc.on('ipc-name', () => {
       // The request is called here.
   }

Upvotes: 0

Views: 545

Answers (1)

Raghu
Raghu

Reputation: 1009

This does not solve the OP problem as the problem exists in Linux env but acts as an workaround.Instead of request module we have to make use of ClientRequest API in electron which is Event based and only makes the task much more difficult.But doesn't suffer from the issue faced in callback inside callback.

Example Code:

function triggerCall() {
    const request = net.request(`${root}/routes/get1`);
    request.on('response', (response) => {
        response.on('data', (chunk) => {
            console.log(`BODY: ${chunk}`)
        })
        response.on('end', () => {
          console.log('req 1 end');
            const request1 = net.request(`${root}/routes/get2`);
            request1.on('response', (response) => {
                response.on('data', (chunk) => {
                    console.log(`BODY: ${chunk}`)
                })
                response.on('end', () => {
                    console.log('req 2 end');
                })
            })
            request1.end();
        })
    })
    request.end();
};

Upvotes: 1

Related Questions