使用Amazon DynamoDB scan操作时报JSON位置0处意外字符u错误
问题根因
错误"Unexpected token u in JSON at position 0"的本质是代码尝试对undefined执行JSON.parse操作:
- GET类型的请求不会携带请求体,因此调用
GET /items接口时,event.body的值为undefined - 你的代码在进入路由判断前,全局执行了
let requestJSON = JSON.parse(event.body);,此时直接触发解析错误,还没走到GET /items的路由逻辑就进入catch分支报错了。
修复方案
将JSON.parse操作移到需要请求体的PUT路由内部执行即可,同时附带修复PUT /signOut接口返回提示文案写反的问题,修改后完整代码如下:
const AWS = require("aws-sdk"); const dynamo = new AWS.DynamoDB.DocumentClient(); exports.handler = async(event, context) => { let body; let statusCode = 200; const headers = { "Content-Type": "application/json" }; try { switch (event.routeKey) { case "GET /items": body = await dynamo.scan({ TableName: "users" }) .promise(); break; case "PUT /signIn": { // 仅在需要请求体的路由内解析body const requestJSON = JSON.parse(event.body); await dynamo .update({ TableName: "users", Key: { UserId: requestJSON.UserId }, UpdateExpression: "set SignedInAt = :a, IsSignedIn = :b, SignedOutAt = :c", ExpressionAttributeValues: { ":a": new Date().toLocaleTimeString(), ":b": true, ":c": "" } }) .promise(); body = `User ${requestJSON.UserId} has been signed in.`; break; } case "PUT /signOut": { const requestJSON = JSON.parse(event.body); await dynamo .update({ TableName: "users", Key: { UserId: requestJSON.UserId }, UpdateExpression: "set SignedOutAt = :a, IsSignedIn = :b", ExpressionAttributeValues: { ":a": new Date().toLocaleTimeString(), ":b": false, } }) .promise(); // 修复返回提示文案错误 body = `User ${requestJSON.UserId} has been signed out.`; break; } default: throw new Error(`Unsupported route: "${event.routeKey}"`); } } catch (err) { statusCode = 400; body = err.message; } finally { body = JSON.stringify(body); } return { statusCode, body, headers }; };
内容的提问来源于stack exchange,提问作者Clancinio
相关产品推荐
相关产品推荐

