Я использую рамки Экспресса и я следующий в одном из моих маршрутов файлов:NodeJS обратного вызова - Доступ к «Рез»
var allUsersFromDynamoDb = function (req, res) {
var dynamodbDoc = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: "users",
ProjectionExpression: "username,loc,age"
};
dynamodbDoc.scan(params, function (err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err));
res.statusCode = 500;
res.send("Internal Server Error");
} else {
console.log("DynamoDB Query succeeded.");
res.end(JSON.stringify(data.Items));
}
});
}
Я использую вышеуказанную функцию в одном из моих маршрутов:
router.get('/users', allUsersFromDynamoDb);
Теперь обратный вызов, который я определяю при выполнении вызова «scan» на dynamodbDoc, может быть очень полезным, если он определен как отдельная функция. Я могу повторно использовать это для некоторых других моих маршрутов.
Но как я могу получить доступ к «res» внутри этой новой функции?
Я думаю, что я должен использовать «закрытие», но я не могу понять, как это правильно. Я думаю, что мне нужно, чтобы сохранить подпись новой функции обратного вызова ожидать 2 Params, «ERR» и «данные» в соответствии со следующей страницы:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property
Любые идеи о том, как это можно сделать?
Я думаю, что вы можете поместить обратный вызов в свою собственную именованную функцию, пока она находится в той же области действия, из которой вызывается 'dynamodbDoc.scan'. Здесь, из-за функции 'закрытия' JS, ваш обратный вызов будет иметь доступ к одному и тому же объекту' res' как 'dynamodbDoc.scan'. –
О да, это вариант. Я должен был упомянуть об этом в своем описании вопроса. Но если я это сделаю, то функция обратного вызова будет недоступна вне функции allUserFromDynamoDB.Предположим, у меня была другая функция (для другого маршрута) 'getSpecificUserFromDynamoDB', откуда я тоже хотел ее использовать. Надеюсь, ясно, что я говорю. – vksinghh
Проблема заключается в том, что если функция обратного вызова определена вне области действия 'allUsersFromDynamoDb', то она не будет иметь доступа к объектам' res' или req'. Вы можете найти обходное решение, которое я думаю (в зависимости от конкретного использования). –