Используйте значение из функции в другую функцию nodejs express - PullRequest
0 голосов
/ 14 января 2019

Я хочу вернуть значение, которое было объявлено в первой функции CreateTag, и использовать его как переменную во второй функции CreateStream, но оно не будет работать.

Я работаю с nodejs Express. Я пытаюсь использовать RETURN , но это не сработает .. Я попробовал это по-разному, но все еще не работает ..

Можете ли вы мне помочь, пожалуйста?

'use strict';
var express = require('express');
var router = express.Router();

/* GET home page. */

//Function 1: createTag
      var createTag = function hi (TanentValue) {
          var https = require('https');
          var data = JSON.stringify({
        name: TanentValue,
        schemaPath: "Tag"
    });
    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/tag?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

        var req = https.request(options, (res) => {
        //console.log(res)

        res.on('data', (d) => {
            console.log("hi tag")
            var getResult = "GaLvAnI"; // ----> return this and use it into the function createStream
            return getResult;
        })
    })
        ;
    req.on('error', (error) => {
        console.error(error)

    });

    req.write(data);
    req.end();
}
//Function 2: createStream
var createStream = function (TanentValue) {
    var https = require('https');
    var galvani = hi(); // --------> here I made a variable to call return value
    var data = JSON.stringify({
        name: TanentValue,
    });

    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/stream?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

    var req = https.request(options, (res) => {

        res.on('data', (d) => {
            console.log(galvani); // -----> use the variable here
        })
    })
        ;
    req.on('error', (error) => {
        console.error(error)
    });

    req.write(data);
    req.end();
}
//homepage
router.get('/', function (req, res) {
    res.render('index', { title: 'MCS Test' });
});
//create
router.post('/create', function (req, res) {
    //create tag
    console.log('POST / Call Create Tag');
    createTag(req.body.TanentValue);
    //create stream
    console.log('POST / Call Create Stream');
    createStream(req.body.TanentValue);

    res.send('Stream and Tag has been created');
});
module.exports = router;

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы можете решить это, используя только функцию обратного вызова или обещание.

  1. Использование обратных вызовов.

'use strict';
var express = require('express');
var router = express.Router();

/* GET home page. */

//Function 1: createTag
var createTag = (TanentValue, callback) => {
    var https = require('https');
    var data = JSON.stringify({
        name: TanentValue,
        schemaPath: "Tag"
    });

    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/tag?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

    var req = https.request(options, (res) => {

        res.on('data', (d) => {
            console.log("hi tag")
            var getResult = "GaLvAnI"; // ----> return this and use it into the function createStream

            callback(false, getResult);
        })
    });

    req.on('error', (error) => {
        //console.error(error)
        callback(true, error);
    });

    req.write(data);
    req.end();
}



//Function 2: createStream
var createStream = (TanentValue, callback) => {
    var https = require('https');
    var data = JSON.stringify({
        name: TanentValue,
    });

    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/stream?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

    createTag(TanentValue, (is_error, galvani) => {
        if(err || !data){
            // do error handling...
            callback(true); // true for there was an error
        }else{
            var req = https.request(options, (res) => {

                res.on('data', (d) => {
                    callback(false);
                    console.log(galvani); // -----> use the variable here
                })
            });

            req.on('error', (error) => {
                callback(true);
                console.error(error)
            });

            req.write(data);
            req.end();
        }
    })
}


//homepage
router.get('/', function (req, res) {
    res.render('index', { title: 'MCS Test' });
});

//create
router.post('/create', function (req, res) {
    /*
    // Since the stream seems to depend on the tag created,
    // you don't need to call createTag explicitly because
    // it is always/already called from createStream.

    //create tag
    console.log('POST / Call Create Tag');
    createTag(req.body.TanentValue, function(is_error, data){
        if(!is_error){
            // do something
        }else{
            // do error handling
            console.error(error);
            res.send('Tag could not be created, please try later again..');
        }
    });
    */

    //create stream
    console.log('POST / Call Create Stream');
    createStream(req.body.TanentValue, is_error => {
        if(!is_error){
            res.send('Stream and Tag has been created');
        }else{
            res.send('Stream could not be created, please try later again..');
        }
    });

});
module.exports = router;
  1. Использование Promise

'use strict';
var express = require('express');
var router = express.Router();

/* GET home page. */

//Function 1: createTag
var createTag = TanentValue => {
    var https = require('https');
    var data = JSON.stringify({
        name: TanentValue,
        schemaPath: "Tag"
    });

    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/tag?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

    return new Promise((resolve, reject) => {
        var req = https.request(options, (res) => {

            res.on('data', (d) => {
                console.log("hi tag")
                var getResult = "GaLvAnI"; // ----> return this and use it into the function createStream

                resolve(getResult);
            })
        });

        req.on('error', (error) => {
            //console.error(error)
            reject(error);
        });

        req.write(data);
        req.end();
    })
}



//Function 2: createStream
var createStream = TanentValue => {
    var https = require('https');
    var data = JSON.stringify({
        name: TanentValue,
    });

    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/stream?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

    createTag(TanentValue).then( galvani => {
        return new Promise((resolve, reject) => {
            var req = https.request(options, (res) => {

                res.on('data', (d) => {
                    console.log(galvani); // -----> use the variable here
                    resolve(d);
                })
            });

            req.on('error', (error) => {
                console.error(error)
                reject({ msg: 'request error while creating the stream', error: error})
            });

            req.write(data);
            req.end();
        })
    }).catch( error => {
        // do error handling...
        reject({msg: 'Error while creating a tag', error: error}); // true for there was an error
    });
}


//homepage
router.get('/', function (req, res) {
    res.render('index', { title: 'MCS Test' });
});

//create
router.post('/create', function (req, res) {
    /*
    // Since the stream seems to depend on the tag created,
    // you don't need to call createTag explicitly because
    // it is always/already called from createStream.

    //create tag
    console.log('POST / Call Create Tag');
    createTag(req.body.TanentValue).then( data => {
        // do something
    }).catch( error => {
        // do error handling
    });
    */

    //create stream
    console.log('POST / Call Create Stream');
    createStream(req.body.TanentValue).then( data => {

        res.send('Stream and Tag has been created');

    }).catch(error => {
        // 'Stream could not be created, please try later again..'
        res.send(error.msg);
    });

});
module.exports = router;
0 голосов
/ 15 января 2019

Очень удобно! Спасибо, это работает! Но при передаче данных (Json) из функции 1 в функцию 2 с помощью Promise данные (json) не определены в функции 2. Если я передам данные (String) из функции 1 в функцию 2, то это сработает ..

Почему это дает мне undefine, когда это JSON?

     //var id;
    var req = https.request(options, (res) => {
        //console.log(res)
        res.setEncoding('utf8');
        res.on('data', function (data) {
            var json = JSON.parse(data);
            var TagId = JSON.stringify(json[0]);
            console.log("2 hi getTap");
            console.log(TagId); // -------> here it works well
            resolve(TagId);
        });
    });

        var req = https.request(options, (res) => {

            res.on('data', (d) => {
                console.log("3 hi createStream");
                console.log(galvani); // -------> here it doesn't work.. it gives me undefine

            })
        });

здесь распечатка ответа

0 голосов
/ 14 января 2019

вы не можете напрямую вернуть значение из асинхронной функции. Вы должны использовать обещание. как то так:

'use strict';
var express = require('express');
var router = express.Router();

/* GET home page. */

//Function 1: createTag
var createTag = function (TanentValue) { // function should be anonymouse
  return new Promise((resolve, reject) => {
    var https = require('https');
    var data = JSON.stringify({
      name: TanentValue,
      schemaPath: "Tag"
    });
    var options = {
        hostname: 'qlik_dev.be',
        path: '/meteor/qrs/tag?xrfkey=1234567890123456',
        method: 'POST',
        headers: {
            'x-qlik-xrfkey': '1234567890123456',
            'hdr-usr': 'gak\\gaka',
            'Content-Type': 'application/json'
        },
    };

        var req = https.request(options, (res) => {
        //console.log(res)

        res.on('data', (d) => {
            console.log("hi tag")
            var getResult = "GaLvAnI"; // ----> return this and use it into the function createStream
            resolve(getResult); // success call
        })
    })
        ;
    req.on('error', (error) => {
        reject(error); // error call

    });

    req.write(data);
    req.end();
  });
    
}
//Function 2: createStream
var createStream = function (TanentValue) {
    createTag().then((val) => {
      var https = require('https');
      var galvani = val; // use that value from sucess call
      var data = JSON.stringify({
          name: TanentValue,
      });

      var options = {
          hostname: 'qlik_dev.be',
          path: '/meteor/qrs/stream?xrfkey=1234567890123456',
          method: 'POST',
          headers: {
              'x-qlik-xrfkey': '1234567890123456',
              'hdr-usr': 'gak\\gaka',
              'Content-Type': 'application/json'
          },
      };

      var req = https.request(options, (res) => {

          res.on('data', (d) => {
              console.log(galvani); // -----> use the variable here
          })
      })
          ;
      req.on('error', (error) => {
          console.error(error)
      });

      req.write(data);
      req.end();
    })
    .catch((error) => {
      // handle error from createTag function here
    });
    
}
//homepage
router.get('/', function (req, res) {
    res.render('index', { title: 'MCS Test' });
});
//create
router.post('/create', function (req, res) {
    //create tag
    console.log('POST / Call Create Tag');
    createTag(req.body.TanentValue);
    //create stream
    console.log('POST / Call Create Stream');
    createStream(req.body.TanentValue);

    res.send('Stream and Tag has been created');
});
module.exports = router;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...