我正在编写一个无服务器应用程序,并且在调用函数内部的lambda函数时遇到麻烦。两个功能分别按预期工作。当我尝试从功能A执行功能B时,出现以下错误。
JSON在位置0处出现意外令牌
这是我的代码,我确定我的有效载荷没有传递给第二个函数,我该如何解决呢? 功能A
module.exports.create = (event, context, callback) => {
console.log('inside');
const timestamp = new Date().getTime();
console.log(JSON.parse(event.body));
const data = JSON.parse(event.body);
var jsonObj = {'user_avatar' : 'data.user_avatar',
'name' : 'data.name'}
const params2 = {
FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
InvocationType: "RequestResponse",
LogType: 'Tail',
Payload: JSON.stringify(jsonObj)
};
lambda.invoke(params2, function (err, data) {
if (err) {
console.log('error : ' + err)
callback(err, null)
} else if (data) {
const response = {
statusCode: 200,
body: JSON.parse(data.Payload)
}
callback(null, response)
}
})
const params = {
TableName: process.env.BANK_TABLE,
Item: {
id: uuid.v1(),
bankName: data.bankName,
bankUrl: data.bankUrl,
bankCardUrl: data.bankCardUrl,
bankLogoID: data.bankLogoID,
createdAt: timestamp,
updatedAt: timestamp,
},
};
// write the offers to the database
dynamoDb.put(params, (error) => {
// handle potential errors
if (error) {
console.error(error);
callback(null, {
statusCode: error.statusCode || 501,
headers: { 'Content-Type': 'text/plain' },
body: 'Couldn\'t create the offer item.',
});
return;
}
console.log('setting callback');
// create a response
const response = {
statusCode: 200,
body: JSON.stringify(params.Item),
};
callback(null, response);
});
};
功能B
module.exports.create = (event, context, callback) => {
console.log('staring');
console.log(JSON.parse(event.body));
let encodedImage =JSON.parse(event.body).user_avatar;
let decodedImage = Buffer.from(encodedImage, 'base64');
var filePath = "avatars/" + JSON.parse(event.body).name + ".jpg"
var params = {
"Body": decodedImage,
"Bucket": "imageuploads",
"Key": filePath
};
s3.upload(params, function(err, data){
if(err) {
callback(err, null);
} else {
let response = {
"statusCode": 200,
"headers": {
"my_header": "my_value"
},
"body": JSON.stringify(data),
"isBase64Encoded": false
};
callback(null, response);
}
});
};
答案 0 :(得分:1)
您收到的错误:
JSON在位置0处出现意外令牌
通常是由于JSON格式错误。 遵循W3Schools中的JSON语法:
JSON名称需要双引号。 JavaScript名称没有。
所以您的jsonObj应该是:
var jsonObj = {"user_avatar" : data.user_avatar,
"name" : data.name}
另外,请注意data.user_avatar
和data.name
是变量,它们不应该带有引号。
答案 1 :(得分:0)
问题出在从A发送到B的有效载荷中。
(请注意,JSON.parse(undefined)
几乎始终是SyntaxError: Unexpected token u in JSON at position 0
背后的罪魁祸首)。
函数B第3行说:console.log(JSON.parse(event.body));
但是,您来自A(A,第12行)的有效载荷为:{'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}
。
这意味着event = JSON.stringify({'user_avatar' : 'data.user_avatar', 'name' : 'data.name'})
和event.body === undefined
,这是为什么,当您尝试JSON.parse(event.body)
时遇到错误。
要执行此操作,您需要将A行7更改为:
var jsonObj = { body: { user_avatar: 'data.user_avatar', name: 'data.name' } };
我怀疑当您分别调用API网关(事件形状为{ body: ...data }
或控制台中的测试正文具有类似的功能)时,单独调用它是可行的。
答案 2 :(得分:0)
如果您在内部调用lambda函数(例如,对于单元测试),则应确保将其作为json http格式发送。
create({body: JSON.stringify(myBodyObject)}, null, callBack)
答案 3 :(得分:0)
您必须更改请求正文。
const data = JSON.parse(event.body);
var jsonObj = {
body: { //add body
'user_avatar': data.user_avatar, //remove single quotes
'name': data.name //remove single quotes
}
}
const params2 = {
FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
InvocationType: "RequestResponse",
LogType: 'Tail',
Payload: JSON.stringify(jsonObj)
};
lambda.invoke(params2, function(err, data) {
if (err) {
console.log("error : " + err);
callback(err, null);
} else if (data) {
const response = {
statusCode: 200,
body: JSON.parse(data.Payload)
};
callback(null, response);
}
});