Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Node.js构建异步对象_Node.js - Fatal编程技术网

使用Node.js构建异步对象

使用Node.js构建异步对象,node.js,Node.js,我试图使用AWS密钥管理服务KMS从AWS Lambda函数中解密一些环境变量,然后使用解密的凭据发布一条推文。但是,在我使用Twitter对象之前,环境变量没有被解密。这会导致身份验证失败 在调用其成员函数之前,如何确保下面代码中的Twitter对象已完全实例化/初始化?我应该改用承诺吗 var AWS = require('aws-sdk'); var Twitter = require('twitter'); var s3 = new AWS.S3(); var kms = new AWS

我试图使用AWS密钥管理服务KMS从AWS Lambda函数中解密一些环境变量,然后使用解密的凭据发布一条推文。但是,在我使用Twitter对象之前,环境变量没有被解密。这会导致身份验证失败

在调用其成员函数之前,如何确保下面代码中的Twitter对象已完全实例化/初始化?我应该改用承诺吗

var AWS = require('aws-sdk');
var Twitter = require('twitter');
var s3 = new AWS.S3();
var kms = new AWS.KMS();

function DecryptEnvironmentVariable(creds, varname) {
    console.log(`Decrypting environment variable named ${varname}`);
    console.log(process.env[varname]);

    params = {
        CiphertextBlob: process.env[varname]
    }
    kms.decrypt(params, function (err, data) {
        if (err) {
            console.log(err);
        }
        else {
            console.log("Successfully decrypted envrionment variable.");
            return data.Plaintext;
        }
    });
}

exports.tweet = function (event, context) {
    // Instantiate the Twitter object
    var twitterclient = new Twitter({
        consumer_key: DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'),
        consumer_secret: DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'),
        access_token_key: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'),
        access_token_secret: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET'),
    })

    // Post a new tweet
    twitterclient.post('statuses/update', { status: "messagegoeshere" })
    .then(function(tweet) {
        console.log("Tweet was successfully posted!");
    })
    .catch(function(error) {
        console.log("Error occurred while posting tweet. :(");
        console.log(error);
    });
}
AWS Lambda。因此,您实际上不需要自己使用KMS对它们进行加密/解密。使用内置环境变量可以让您更轻松地同步使用它们,只需在正常情况下访问它们:process.env.TWITTER\u CONSUMER\u KEY。

DecryptEnvironment变量实际上不会返回任何内容,因此您无法真正按照您尝试的方式使用它

由于您需要获得多个异步操作的结果,因此最简单的方法可能是使用Promise。假设您使用的是当前版本的nodejs:

var AWS = require('aws-sdk');
var Twitter = require('twitter');
var s3 = new AWS.S3();
var kms = new AWS.KMS();

function DecryptEnvironmentVariable(creds, varname) {
  return new Promise(function (resolve, reject) {
    console.log(`Decrypting environment variable named ${varname}`);
    console.log(process.env[varname]);

    params = {
      CiphertextBlob: process.env[varname]
    }
    kms.decrypt(params, function (err, data) {
      if (err) {
        console.log(err);
        reject(err);
      }
      else {
        console.log("Successfully decrypted envrionment variable.");
        resolve(data.Plaintext);
      }
    });
  });
}

exports.tweet = function (event, context) {
  // Instantiate the Twitter object
  var tasks = [
    DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'),
    DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'),
    DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'),
    DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET')
  ];

  return Promise.all(tasks).then(function (keys) {

    var twitterclient = new Twitter({
      consumer_key: keys[0],
      consumer_secret: keys[1],
      access_token_key: keys[2],
      access_token_secret: keys[3]
    });

    // Post a new tweet
    return twitterclient.post('statuses/update', { status: "messagegoeshere" });
  })
  .then(function(tweet) {
    console.log("Tweet was successfully posted!");
  })
  .catch(function(error) {
    console.log("Error occurred while posting tweet. :(");
    console.log(error);
  });
}

仅供参考,AWS SDK现在支持promises,因此您可以在DecryptEnvironmentVariable函数中执行类似于返回kms.decryptparams.promise的操作,而不是将整个过程包装在新的promise中。很好,我在检查文档时没有看到这一点,但我看起来也不太强硬文档有点隐藏。本质上,返回一个实例,该实例又有一个。