問題
我想從 Lambda 函式(node.js v12 運行時)運行以下代碼:
const client = require('twilio')(process.env.ACCOUNT_SID, process.env.AUTH_TOKEN);
console.log("Start.");
client.messages.create({
body: 'Msg',
to: ' 1234567890',// a verified number
from: ' 1234567890' // a valid Twilio number
})
.then((message) => {
console.log(message.sid);
})
.catch((e) => {
console.log(Error(e));
console.log("Error in Signup");
});
console.log("Done.");
我可以在本地運行它,并按我應該的方式接收到目標號碼的訊息,但是當我將其全部壓縮,將其移動到 Lambda 并運行它時,我只得到Start和Done,沒有輸出,也沒有來自create函式的短信。
嘗試的解決方案
我已經嘗試用實際值替換環境變數只是為了確保這不是問題,我已經檢查了 Twilio 日志,除了我在本地進行的成功呼叫之外,沒有其他任何內容。
我可以確認,每次運行時,它都會到達client.messages.create,然后似乎只是跳過它,沒有輸出,Done是接下來的事情。
我讓它作業了一次,通過console.log(process.env.ACCOUNT_SID)在第一行之前添加一個陳述句(這是在使用環境變數而不是硬編碼值時),日志陳述句的輸出是undefined但無論出于何種原因發送的訊息并輸出訊息的 SID。然后它又停止作業了。
然后幾個小時后,當我console.log(client.messages)在創建client. 在那之后它再次停止作業。
任何幫助將不勝感激,我從來沒有像現在這樣相信惡作劇者。
完整代碼
其中大部分取自此處和此處。
exports.handler = async (event, context, callback) => {
const AWS = require('aws-sdk');
const b64 = require('base64-js');
const encryptionSdk = require('@aws-crypto/client-node');
const Twilio = require('twilio');
// Configure the encryption SDK client with the KMS key from the environment variables.
const { encrypt, decrypt } = encryptionSdk.buildClient(encryptionSdk.CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
const generatorKeyId = process.env.KEY_ALIAS;
console.log(process.env.KEY_ALIAS);
const keyIds = [ process.env.KEY_ID ];
console.log(process.env.KEY_ID);
const keyring = new encryptionSdk.KmsKeyringNode({ generatorKeyId, keyIds });
// Decrypt the secret code using encryption SDK.
let plainTextCode;
if(event.request.code){
const { plaintext, messageHeader } = await decrypt(keyring, b64.toByteArray(event.request.code));
plainTextCode = plaintext;
}
// Your Account SID from www.twilio.com/console
// See http://twil.io/secure for important security information
const accountSid = process.env.ACCOUNT_SID;
console.log(process.env.ACCOUNT_SID);
// Your Auth Token from www.twilio.com/console
// See http://twil.io/secure for important security information
const authToken = process.env.AUTH_TOKEN;
console.log(authToken);
if(event.triggerSource == 'CustomSMSSender_SignUp'){
console.log('CustomSMSSender_SignUp');
// Send sms to end-user using custom or 3rd party provider.
// Import Twilio's Node Helper library
// Create an authenticated Twilio Client instance
const client = require('twilio')(process.env.ACCOUNT_SID, process.env.AUTH_TOKEN);
// Send a text message
client.messages.create({
body: `You're verification code is ${plainTextCode.toString()}.`,
to: event.request.userAttributes.phone_number, // user's phone number
from: ' 1234567890' // redacted, actual value is a Twilio phone number
})
.then((message) => {
// Success, return message SID
console.log(message.sid);
})
.catch((e) => {
// Error, return error object
console.log(Error(e));
console.log("Error in Signup");
});
}
};
當我在這里時,如果有人能解釋為什么我可以列印 KEY_ALIAS 和 KEY_ID 環境變數但 ACCOUNT_SID 和 AUTH_TOKEN 都被記錄為undefined. 它們都確實存在。
uj5u.com熱心網友回復:
Twilio 開發人員布道者在這里。
您正在使用標記為 的 Lambda 函式async,該函式將在函式內完成所有處理后立即回傳,包括異步處理,只要它使用await關鍵字。問題是您呼叫了 Twilio API,它是一個異步函式,但不使用await,因此處理之后立即完成并且 Lambda 函式結束。
AWS 實際上會暫停 JS 事件回圈,并在再次呼叫 Lambda 時恢復它,因此您甚至可能會在運行該函式后幾秒鐘或幾分鐘內發現訊息正在傳遞,就像這個提問者所做的那樣。
解決的方法是看await呼叫API的結果。然后您可以將其包裝在 a 中try/catch以從錯誤中恢復,而不是使用.thenand .catch。
exports.handler = async (event, context, callback) => {
const b64 = require("base64-js");
const encryptionSdk = require("@aws-crypto/client-node");
const Twilio = require("twilio");
// Configure the encryption SDK client with the KMS key from the environment variables.
const { decrypt } = encryptionSdk.buildClient(
encryptionSdk.CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
);
const generatorKeyId = process.env.KEY_ALIAS;
console.log(process.env.KEY_ALIAS);
const keyIds = [process.env.KEY_ID];
console.log(process.env.KEY_ID);
const keyring = new encryptionSdk.KmsKeyringNode({ generatorKeyId, keyIds });
// Decrypt the secret code using encryption SDK.
let plainTextCode;
if (event.request.code) {
const { plaintext } = await decrypt(
keyring,
b64.toByteArray(event.request.code)
);
plainTextCode = plaintext;
}
if (event.triggerSource == "CustomSMSSender_SignUp") {
console.log("CustomSMSSender_SignUp");
// Create an authenticated Twilio Client instance
const client = Twilio(process.env.ACCOUNT_SID, process.env.AUTH_TOKEN);
try {
// Send a text message
const message = await client.messages.create({
body: `You're verification code is ${plainTextCode.toString()}.`,
to: event.request.userAttributes.phone_number, // user's phone number
from: " 1234567890", // redacted, actual value is a Twilio phone number
});
// Success, return message SID
console.log(message.sid);
} catch (error) {
// Error, return error object
console.log(Error(e));
console.log("Error in Signup");
}
}
};
至于process.env.ACCOUNT_SID和process.env.AUTH_TOKEN被注銷的undefined,這表明他們沒有正確設定。確保它們在正確的環境中配置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380788.html
上一篇:您可以將引數傳遞給Cloudformation中的bash腳本嗎?
下一篇:如何有條件地創建S3存盤桶
