2

介绍

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

命令

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

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

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

需要的功能

我需要在第一个函数中重试的变量和在第二个函数中生成的 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);
    }
});
4

2 回答 2

1

最好的方法是在你的函数中使用非常有名和有用的async包(安装)包将是这样的:npm install asyncnpm

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
}
)
}
于 2017-06-12T10:54:27.253 回答
0

处理此问题的另一种方法是允许express 中间件流在单独的Router上为您做这些事情。

我已经设置了一个示例 Glitch供您参考,使用stand in 函数来模拟网络调用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
            });
        }
    });
});
于 2017-06-12T11:47:17.703 回答