Глядя в отражатель, вы можете видеть верхнюю часть ChangeType(object, Type, IFormatProvider)
, которая называется тем, что вызывается под обложками:
public static object ChangeType(object value, Type conversionType, IFormatProvider provider)
{
//a few null checks...
IConvertible convertible = value as IConvertible;
if (convertible == null)
{
if (value.GetType() != conversionType)
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
return value;
}
Таким образом, он выглядит как объект типа, который не реализовать IConvertible
, но уже есть , тип назначения просто вернет исходный объект.
Предоставлено, что это исключение only для значения, требуемого для реализации IConvertible
, но это исключение и похоже на причину, по которой параметр object
вместо этого.
Вот быстрый тест LinqPad для этого случая:
void Main()
{
var t = new Test();
var u = Convert.ChangeType(t, typeof(Test));
(u is IConvertible).Dump(); //false, for demonstration only
u.Dump(); //dump of a value Test object
}
public class Test {
public string Bob;
}
Если вы не хотите извлекать его в переменную перед доступом к телу, как подсказал @tuulka, просто заключите его в скобки.
const data = (await (s3.getObject(params).promise())).Body.toString('utf-8')
Время ожидания AWS SDK по умолчанию составляет 120000 мс. Если тайм-аут вашей лямбды короче, вы никогда не получите фактическую ошибку.
Либо увеличьте время ожидания AWS
var AWS = require('aws-sdk');
var s3 = new AWS.S3({httpOptions: {timeout: 3000}});
, либо увеличьте время ожидания лямбды.
Эта проблема определенно связана с подключением.
Проверьте настройки VPC, так как он может блокировать подключение Lambda к Интернету (управляемые сервисы AWS в качестве S3 доступны только через Интернет).