我正在与 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
错误仅在此模型上出现,相同的代码在另一个表上起作用。
答案 0 :(得分:4)
我的猜测是问题可能与您的属性名称model
有关。
实际上,这是实际情况:从Document.ts
中的source code提取的以下代码是覆盖model
属性的代码:
Object.defineProperty(this, "model", {
"configurable": false,
"value": model
});
这是Document
之前的样子:
在执行了上述代码之后:
当库将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);
}
});