我正在使用typeform的webhook来获得答案。现在我想直接将答案存储在我的数据库中。例如,如果用户输入他/她的名字,则答案应直接存储在用户模型中。为了使它工作,我需要一些来自问题的信息,它是用户的名字。有没有办法添加隐藏的标签(名称,年龄,性别)来识别问题。我不能硬编码问题ID,因为我有很多形式有不同类型的问题。
如果要在数据库表中存储响应,则必须在进行响应时对其进行硬编码或创建表。即从响应中读取问题数组并相应地创建表,并在新创建的表中存储响应。下次检查是否有表创建,如果是,则存储值,否则创建新表。
这是我动态读取响应的示例代码:
function renderData(data) {
var header = '', rows = '';
var questions = data.questions;
var responses = data.responses;
for (var j = 0; j < questions.length; j++) {
header += '<th>' + questions[j].question + '</th>';
}
for (var i = 0; i < responses.length; i++) {
rows += "<tr>"
for (var j = 0; j < questions.length; j++) {
if (responses[i].answers[questions[j].id] == undefined) {
rows += '<td> - </td>'
} else {
rows += '<td>' + responses[i].answers[questions[j].id] + '</td>';
}
}
rows += "</tr>"
}
$('table').append(
'<table>' + '<thead>' + header + '</thead>' + '<tbody>' + rows
+ '</tbody>' + '</table>');
};
以上函数将data
作为typeform API的响应并创建答案表。我跳它会对你有所帮助。
我建议将字段标题与正则表达式匹配。由于字段标题是句子,因此按特定顺序匹配它们很有用,并且将已经匹配的字段从运行中取出。应首先匹配更具体的字段。这类似于使用普通英语的黄瓜测试工具。
这里有一些我尚未尝试过的代码,以便了解我的目标:
class TypeformReader() {
constructor(data) {
this.fields = data.form_response.definition.fields;
this.answers = data.form_response.answers;
this.read = [];
}
getAnswer(pattern, markRead = false, ignoreRead = true) {
for (let field of this.fields) {
if (ignoreRead && this.read.includes(field.id)) {
continue;
}
if (pattern.test(field.title)) {
for (let answer of this.answers) {
if (answer.field.id == field.id)
if (markRead) {
this.read.push(field.id);
}
return answer;
}
}
}
}
}
}
这是一个如何使用这个类的例子。如果你有一个狗瑜伽课的字形,上面写着“你叫什么名字?”和“你的狗叫什么名字?”你想先匹配较长的一个(还包括“你的电子邮件是什么?”这是一个电子邮件字段,答案是email
,而不是text
)。
const reader = new TypeformReader(req.data);
const dogName = reader.getAnswer(/\bname\b.*\bdog\b/).text;
const name = reader.getAnswer(/\bname\b/).text;
const email = reader.getAnswer(/\bemail\b').email;