节点js使用主函数外的variables并设置函数的顺序

介绍

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

订购

  1. 第一个函数函数从一个post检索数据。

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

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

需要的function

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

问题和问题

  • 在第三个函数中没有findemailUser
  • 在第三个函数中没有findapi_key
  • 还需要按照第一,第二和第三的顺序运行

这一切都工作,如果我插入数据手册,但inputvariables时,它不会工作,我明白,这是因为variables是在函数内,但我该如何解决这个问题,也如何设置函数的顺序?

完整的代码

 // 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); } }); 

最好的方法是使用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 } ) } 

处理这个问题的另一种方法是让高速中间件stream程在单独的路由器上为你做这些事情。

我已经设置了一个示例毛刺供您参考,使用stand in函数来模拟此处的networking调用。

在你的情况下,你将不得不这样做:

 //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 }); } }); });