节点js使用主函数外部的变量并设置函数的顺序

时间:2017-06-12 10:37:13

标签: javascript node.js api request pardot

简介

我有三个功能,每个功能都会将数据输入到下一个。目标是首先检索数据然后验证API密钥,然后最终使用生成的API密钥和数据从第一个函数发布中检索到第三个函数中的API。

订单

  1. 第一个从帖子中检索数据的函数。

  2. 第二个函数获取API请求的API密钥。

  3. 第三个功能将数据发布到API。

  4. 需要的功能

    我需要在第一个函数中重试变量,在第二个函数中生成的API密钥可用于第三个函数。

    问题和疑问

    • emailUser未在第三个函数
    • 中找到使用 在第三个函数中找不到
    • api_key
    • 还需要按顺序运行第一,第二和第三

    如果我要插入数据手册但输入的变量不起作用,这一切都有效,我明白这是因为变量在函数内但我该怎么解决这个问题,我该如何设置顺序的功能?

    完整代码

    // Grab the packages needs and sets server
    //---------------------------------- Grab the packages we need and set variables --------------------------------------------------
    // --------------------------------------------------------------------------------------------------------------------------------
    var express = require('express');
    var request = require('request');
    var nodePardot = require('node-pardot');
    var bodyParser = require('body-parser');
    var app = express();
    var port = process.env.PORT || 8080;
    
    // Varibles to use in second and third function
    var password = 'password';
    var userkey = '6767712';
    var emailAdmin = 'admin@admin.com';
    // start the server
    app.listen(port);
    app.use(bodyParser.json()); // support json encoded bodies
    app.use(bodyParser.urlencoded({extended: true})); // support encoded bodies
    console.log('Server started! At http://localhost:' + port);
    
    // First Retrieve posted data from Front-End
    //---------------------------------- Retrieve posted data from Front-End -----------------------------------------------------
    // ---------------------------------------------------------------------------------------------------------------------------
    // POST http://localhost:8080/api/index
    app.post('/api/data', function (req, res) {
        console.log(req.body);
        var Fname = req.body.fname;
        var Lname = req.body.lname;
        var emailUser = req.body.email;
        res.send(Fname + ' ' + Lname + ' ' + emailUser);
    });
    
    app.get('/', function (req, res) {
        res.send('hello world, Nothing to see here...');
    });
    
    // Second Get Posted variables
    //---------------------------------- Now authenticate the api and get api_key -----------------------------------------------------
    // --------------------------------------------------------------------------------------------------------------------------------
    nodePardot.PardotAPI({
        userKey: userkey,
        email: emailAdmin,
        password: password,
        // turn off when live
        DEBUG: true
    }, function (err, client) {
        if (err) {
            // Authentication failed
            // handle error
            console.error("Authentication Failed", err)
        } else {
            // Authentication successful
            // gets api key
            var api_key = client.apiKey;
            console.log("Authentication successful !", api_key);
        }
    });
    
    // Third Retrieve posted data from Front-End
    //---------------------------------- Send all data to API -----------------------------------------------------
    // ------------------------------------------------------------------------------------------------------------
    // Set the headers
    var headers = {
        'User-Agent':       'Super Agent/0.0.1',
        'Content-Type':     'application/x-www-form-urlencoded'
    };
    
    // Configure the request
    var options = {
        url: 'https://pi.pardot.com/api/prospect/version/4/do/create/email',
        method: 'POST',
        headers: headers,
        form: {
            'email': emailUser,
            'user_key': userkey,
            'api_key': api_key
        }
    };
    
    // Start the request
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            // Print out the response body
            console.log("error",body)
        }
        else {
            console.log("Sent Data",body);
        }
    });
    

2 个答案:

答案 0 :(得分:1)

最好的方法是使用async包(与npm install async一起安装),这是npm中非常着名和有用的包,您的功能将是这样的:

var async=require('async');

var handler = function (req,res) {
async.auto
(
 {
  getBody: function (cb, results) {
    var body=req.body;
    //prepare body here then send it to next function  
    cb(null, body)
  },
  getApi: ['getBody', function (results, cb) {
    var preparedBody=results.getBody;
    // get the api here and send it to next function
    var apiKey=getApi()  
    cb(null, {apiKey:apiKey,preparedBody:preparedBody})

  }],
  third: ['getApi', function (results, cb) {
    var preparedBody=results.getApi.preparedBody;
    var apiKey=results.getApi.apiKey;
      // now data are here
      cb(null,true)
  }]
},
function (err, allResult) {
  // the result of executing all functions goes here
}
)
}

答案 1 :(得分:0)

解决此问题的另一种方法是允许express middleware flow在单独的Router上为您执行这些操作。

我已设置sample Glitch供您参考,使用功能中的替换来模拟网络呼叫HERE

在您的情况下,您必须执行以下操作:

//API route
var express = require('express');
var router = express.Router();

router.post('/data', function (req, res, next) {
    console.log(req.body);
    req.bundledData = {};
    req.bundledData.fname = req.body.fname;
    req.bundledData.lname = req.body.lname;
    req.bundledData.emailUser = req.body.email;
    next();
});
router.use(function(req, res, next){
    nodePardot.PardotAPI({
        userKey: userkey,
        email: emailAdmin,
        password: password,
        // turn off when live
        DEBUG: true
    }, function (err, client) {
         if (err) {
             // Authentication failed
             // handle error
             console.error("Authentication Failed", err)
         } else {
             // Authentication successful
             // gets api key
             req.bundledData.api_key = client.apiKey;
             console.log("Authentication successful !", api_key);
             next();
         }
   });
});

router.use(function(req, res, next){
    // Set the headers
    var headers = {
        'User-Agent':       'Super Agent/0.0.1',
        'Content-Type':     'application/x-www-form-urlencoded'
    };

    // Configure the request
    var options = {
         url: 'https://pi.pardot.com/api/prospect/version/4/do/create/email',
         method: 'POST',
         headers: headers,
         form: {
            'email': emailUser,
            'user_key': userkey,
            'api_key': api_key
         }
    };

    // Start the request
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            // Print out the response body
            console.log("error",body)
        }
        else {
            console.log("Sent Data",body);
            //Processing is complete
            res.json({
                success:true,
                body:body
            });
        }
    });
});