为何调用DynamoDB put接口时报错:Missing the key nineId in the item?
问题解决:DynamoDB提交数据提示缺少主键nineId
报错原因
你的DynamoDB表nine-project的主键为nineId,但通过Express接口提交的req.body中未包含该字段。DynamoDB的put操作强制要求传入主键值,因此触发参数无效报错。
修复方案
方案1:确保前端请求包含nineId字段
检查调用接口的前端请求体,确认携带nineId键值对,示例请求体:
{ "nineId": "unique-12345", // 其他业务字段... }
方案2:后端自动生成nineId(无需前端传入)
如果主键无需前端指定,可在后端通过UUID生成唯一标识,示例修改代码:
const express = require('express'); const router = express.Router(); const AWS = require('aws-sdk'); // 先安装依赖:npm install uuid const { v4: uuidv4 } = require('uuid'); AWS.config.update({ region:'us-east-2' }) const dynamodb = new AWS.DynamoDB.DocumentClient(); const dynamodbTableName = 'nine-project'; router.post('/', async(req,res)=>{ // 自动生成主键并合并到请求数据 const itemWithKey = { ...req.body, nineId: uuidv4() }; const params = { TableName: dynamodbTableName, Item: itemWithKey } try { await dynamodb.put(params).promise(); const body = { Operation: 'SAVE', Message: 'SUCCESS', Item: itemWithKey } res.json(body); } catch(error) { console.error('保存数据失败:', error); res.status(500).send(error); } })
方案3:添加参数校验提前拦截错误
在处理DynamoDB请求前,先校验请求体是否包含nineId,提前返回错误提示:
router.post('/', async(req,res)=>{ if (!req.body.nineId) { return res.status(400).send('请求参数缺失:必须包含nineId字段'); } const params = { TableName: dynamodbTableName, Item: req.body } try { await dynamodb.put(params).promise(); const body = { Operation: 'SAVE', Message: 'SUCCESS', Item: req.body } res.json(body); } catch(error) { console.error('保存数据失败:', error); res.status(500).send(error); } })
额外优化
原代码同时使用await和.then()属于冗余写法,统一用try/catch处理异步错误,代码结构更清晰,上述修复方案已调整该问题。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

