预期“属性”为字符串类型,而是找到了类型对象-Dynamoose

时间:2020-07-06 17:13:28

标签: node.js amazon-dynamodb dynamoose

我正在与 AWS DynamoDB Dynamoose一起使用Scan函数尝试获取记录,但是遇到了我无法识别的问题。

Stragenly,它能够以相同的方式从另一个表中获取记录并成功获取记录。

这是我的代码:

const vehicleMasterSchema = new dynamoose.Schema({
    "id": String,
    "customer_account_number": String,
    "fuel_type": String,
    "make": String,
    "model": String,
    "odometer_gatex": String,
    "plate_no": String,
    "rfid_gatex": String,
    "sales_agreement_id": String,
    "vehicle_category": String,
    "vehicle_id": String,
}, {
    "timestamps": {
        "createdAt": "create_date",
        "updatedAt": null // updatedAt will not be stored as part of the timestamp
    }
});
const vehicleMasterModel = dynamoose.model("vehicle_master", vehicleMasterSchema, { "create": false });

router.post('/getFuelingStatus', (req, res) => {
    var companyInfo = req.body;
    try {
        console.log(typeof vehicleMasterModel);
        vehicleMasterModel.scan("customer_account_number").eq(companyInfo.customerId).exec((error, results) => {
            if (error) {
                console.error(error);
            } else {
                res.json(results);
            }
        });
    } catch (error) {
        res.json(error);
    }
});

TypeMismatch错误仅在此模型上出现,相同的代码在另一个表上起作用。

控制台错误

console error

我的桌子

table data

这似乎与此github issue on Dyanmoose

有关

3 个答案:

答案 0 :(得分:4)

我的猜测是问题可能与您的属性名称model有关。

实际上,这是实际情况:从Document.ts中的source code提取的以下代码是覆盖model属性的代码:

Object.defineProperty(this, "model", {
  "configurable": false,
  "value": model
});

这是Document之前的样子:

document before

在执行了上述代码之后:

document after

当库将DynamoDB返回的每个Scan映射到其内部exec表示形式时,在处理DocumentRetriever.ts中的Item Document函数时将执行此代码,完全在this line的代码中:

const array: any = (await Promise.all(result.Items.map(async (item) => await new this.internalSettings.model.Document(item, {"type": "fromDynamo"}).conformToSchema({"customTypesDynamo": true, "checkExpiredItem": true, "saveUnknown": true, "modifiers": ["get"], "type": "fromDynamo"})))).filter((a) => Boolean(a));

您报告的错误是由于根据checkTypeFunction中的模式模型检查了返回的Item的类型而导致的更改的结果:

const {isValidType, matchedTypeDetails, typeDetailsArray} = utils.dynamoose.getValueTypeCheckResult(schema, value, genericKey, settings, {"standardKey": true, typeIndexOptionMap});
if (!isValidType) {
  throw new Error.TypeMismatch(`Expected ${key} to be of type ${typeDetailsArray.map((detail) => detail.dynamicName ? detail.dynamicName() : detail.name.toLowerCase()).join(", ")}, instead found type ${typeof value}.`);
...

请尝试使用其他名称,我认为它会正常工作。

答案 1 :(得分:1)

模式必须是这样的:

const ImageGalleryFoldersSchema = new Schema({
  key: {
    type: String,
    hashKey: true,
    required: true,
  },
  displayName: {
    type: String,
    required: true,
  },
  parentFolderKey: {
    type: String,
    required: false,
  },
  isActive: {
    type: Boolean,
    default: true,
    required: false,
  },
}, {
  timestamps: true,
});

答案 2 :(得分:0)

也许您的问题是由于异步行为引起的。

更具体地说,我认为当您调用“扫描”功能链时,主体请求尚未完成。但是,由于提升的性质,在输入函数调用之前,对象“ companyInfo”已经被初始化。

因此,您可能会收到指定的“ TypeMismatch”错误。

能否请您尝试实现以下async / await-structure并告诉我是否有帮助:

router.post('/getFuelingStatus', async (req, res) => {
    var companyInfo = await req.body;
    try {
        console.log(typeof vehicleMasterModel);
        vehicleMasterModel.scan("customer_account_number").eq(companyInfo.customerId).exec((error, results) => {
            if (error) {
                console.error(error);
            } else {
                res.json(results);
            }
        });
    } catch (error) {
        res.json(error);
    }
});