我正在编写用于生成PDF的处理程序。该API接受带有JSON数据的POST请求,并返回到生成的PDF的链接。该意图触发此代码,但答案未添加到代理中。请求是否可能不会转发到目的地?该API似乎未收到任何请求。知道如何解决这个问题吗?
function fillDocument(agent) {
const name = agent.parameters.name;
const address = agent.parameters.newaddress;
const doctype = agent.parameters.doctype;
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
var url = "https://us1.pdfgeneratorapi.com/api/v3/templates/36628/output?format=pdf&output=url";
xhr.open("POST", url, true);
xhr.setRequestHeader("X-Auth-Key", "...");
xhr.setRequestHeader("X-Auth-Secret", "...");
xhr.setRequestHeader("X-Auth-Workspace", "...");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var json = JSON.parse(xhr.responseText);
agent.add(json.response);
}
};
var data = JSON.stringify({...});
xhr.send(data);
}
编辑:我继续在GCP中设置一个结算帐户,现在该呼叫可以正常使用了,但是它是异步的。如果我通过执行以下操作将其更改为syn:
xhr.open("POST", url, false);
我收到以下错误:
EROFS: read-only file system, open '.node-xmlhttprequest-sync-2'
我需要使其异步,因为我的机器人应发送的响应取决于API的响应。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
如果要进行异步调用,则处理程序函数需要返回Promise。否则,处理程序调度程序将不知道存在异步调用,并且将在函数返回后立即结束。
将诺言用于网络调用的最简单方法是使用诸如request-promise-native之类的软件包。使用此代码,您的代码可能类似于:
var options = {
uri: url,
method: 'POST',
json: true,
headers: { ... }
};
return rp(options)
.then( body => {
var val = body.someParameter;
var msg = `The value is ${val}`;
agent.add( msg );
});
如果您真的想继续使用xhr,则需要将其包装在Promise中。可能类似
return new Promise( (resolve,reject) => {
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
// ... other XMLHttpRequest setup here
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var json = JSON.parse(xhr.responseText);
agent.add(json.response);
resolve();
}
};
});