Node.js NodeJS的异步等待问题&;AWS Lambda
我目前正在为我的AWS项目开发一个Lamba函数调用,但由于我不是异步函数的大师,它似乎正在崩溃,我编写的代码是:Node.js NodeJS的异步等待问题&;AWS Lambda,node.js,amazon-web-services,async-await,aws-lambda,Node.js,Amazon Web Services,Async Await,Aws Lambda,我目前正在为我的AWS项目开发一个Lamba函数调用,但由于我不是异步函数的大师,它似乎正在崩溃,我编写的代码是: const AWS = require("aws-sdk"); const game = require('game-api'); const uuid = require("uuid"); AWS.config.update({ region: "us-east-1" }); exports.handler = async (event, context, callbac
const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");
AWS.config.update({
region: "us-east-1"
});
exports.handler = async (event, context, callback) => {
//set db
var documentClient = new AWS.DynamoDB.DocumentClient()
//params
const params = {
Item: {
'id': uuid.v1(),
'player_1_name': null,
'player_1_network': null,
'player_1_matches': 0,
'player_1_kills': 0,
'player_1_last_updated': 0,
'player_2_name': null,
'player_2_network': null,
'player_2_matches': 0,
'player_2_kills': 0,
'player_2_last_updated': 0,
'match_id': 0,
'status': 0
},
TableName : 'matches'
};
var matchData = JSON.parse(event.body);
//player 1
const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;
//player 2
const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;
//match data
const match_id = matchData.match_id ? matchData.match_id : 0;
//game object
let gameAPI = new game(
[
"email@email.com",
"password"
]
);
//gameAPI.login() returns a Promise()
await gameAPI.login().then(() => {
//check stats for player 1, getStats returns a Promise()
gameAPI.getStats(player_1_name, player_1_network).then(stats => {
params.Item.player_1_matches = stats.lifetimeStats.matches;
params.Item.player_1_kills = stats.lifetimeStats.kills;
}).catch(err => {
//error! we must work out what to do here!
console.log(err);
});
//example insert
documentClient.put(params, function(err, data){
return callback(err, data);
});
}).catch(err => {
console.log("We failed to login!");
console.log(err);
});
};
这个逻辑似乎有缺陷,因为没有任何东西被抛出到我的AWS日志中?我的想法是将请求发送到函数并让它尽快执行,这样我就可以将200个响应发送回Lambda,有人能给我指出正确的方向吗?使用
async/wait
时,您不需要使用回调
也不需要陷入承诺地狱
只要等待你的承诺并抓住结果。这里最大的优点是看起来代码是同步的
以下是重构后的代码:
const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");
AWS.config.update({
region: "us-east-1"
});
exports.handler = async (event) => {
//set db
var documentClient = new AWS.DynamoDB.DocumentClient()
//params
const params = {
Item: {
'id': uuid.v1(),
'player_1_name': null,
'player_1_network': null,
'player_1_matches': 0,
'player_1_kills': 0,
'player_1_last_updated': 0,
'player_2_name': null,
'player_2_network': null,
'player_2_matches': 0,
'player_2_kills': 0,
'player_2_last_updated': 0,
'match_id': 0,
'status': 0
},
TableName : 'matches'
};
var matchData = JSON.parse(event.body);
//player 1
const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;
//player 2
const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;
//match data
const match_id = matchData.match_id ? matchData.match_id : 0;
//game object
let gameAPI = new game(
[
"email@email.com",
"password"
]
);
//gameAPI.login() returns a Promise()
await gameAPI.login()
const stats = await gameAPI.getStats(player_1_name, player_1_network)
params.Item.player_1_matches = stats.lifetimeStats.matches;
params.Item.player_1_kills = stats.lifetimeStats.kills;
//example insert
await documentClient.put(params).promise();
};
如果需要处理异常(应该),只需将等待调用包装在try/catch
块中,如下所示:
try {
console.log(await somePromise)
} catch (e) {
console.log(e)
}
上面的代码片段相当于:
somePromise.then(console.log).catch(console.log)
最大的区别是,为了保持执行顺序,您不需要链接承诺/异步代码,因此我强烈建议您选择
async/await
方法,而忽略.then().catch()
使用异步/等待
时,您不需要使用回调
也不需要陷入承诺的地狱
只要等待你的承诺并抓住结果。这里最大的优点是看起来代码是同步的
以下是重构后的代码:
const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");
AWS.config.update({
region: "us-east-1"
});
exports.handler = async (event) => {
//set db
var documentClient = new AWS.DynamoDB.DocumentClient()
//params
const params = {
Item: {
'id': uuid.v1(),
'player_1_name': null,
'player_1_network': null,
'player_1_matches': 0,
'player_1_kills': 0,
'player_1_last_updated': 0,
'player_2_name': null,
'player_2_network': null,
'player_2_matches': 0,
'player_2_kills': 0,
'player_2_last_updated': 0,
'match_id': 0,
'status': 0
},
TableName : 'matches'
};
var matchData = JSON.parse(event.body);
//player 1
const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;
//player 2
const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;
//match data
const match_id = matchData.match_id ? matchData.match_id : 0;
//game object
let gameAPI = new game(
[
"email@email.com",
"password"
]
);
//gameAPI.login() returns a Promise()
await gameAPI.login()
const stats = await gameAPI.getStats(player_1_name, player_1_network)
params.Item.player_1_matches = stats.lifetimeStats.matches;
params.Item.player_1_kills = stats.lifetimeStats.kills;
//example insert
await documentClient.put(params).promise();
};
如果需要处理异常(应该),只需将等待调用包装在try/catch
块中,如下所示:
try {
console.log(await somePromise)
} catch (e) {
console.log(e)
}
上面的代码片段相当于:
somePromise.then(console.log).catch(console.log)
最大的区别是,为了保持执行顺序,您不需要链接承诺/异步代码,因此我强烈建议您选择
async/await
方法,忘记.then().catch()
现在它似乎从var matchData=JSON.parse(event.body)抛出错误代码>行&事件
似乎为空您如何测试它?我正在使用postman和direct AWS测试模块;在这些更改之前,matchData
是一个有效的对象。如果要从AWS的控制台进行测试,则必须模拟API的网关事件。只需转到,复制JSON,相应地修改它并使用它来测试它;看着你的回答,我明白我做错了什么!感谢它似乎从var matchData=JSON.parse(event.body)抛出错误代码>行&事件
似乎为空您如何测试它?我正在使用postman和direct AWS测试模块;在这些更改之前,matchData
是一个有效的对象。如果要从AWS的控制台进行测试,则必须模拟API的网关事件。只需转到,复制JSON,相应地修改它并使用它来测试它;看着你的回答,我明白我做错了什么!谢谢