node.js - 进行查询/突变时 Vanilla NodeJS Appsync 客户端错误
问题描述
我正在尝试使用签署和发送请求的普通 nodejs 客户端来访问我的 Appsync GraphQL 端点。它是:
var https = require("https");
let AWS = require("aws-sdk");
let urlParse = require("url").URL;
require("dotenv").config();
const throwOnErrors = ({ query, variables, errors }) => {
if (errors) {
const errorMessage = `
query: ${query.substr(0, 100)}
variables: ${JSON.stringify(variables, null, 4)}
error: ${JSON.stringify(errors, null, 4)}
`;
throw new Error(errorMessage);
}
};
module.exports = async (
url,
credentials,
query,
operationName,
variables = {}
) => {
AWS.config.update({
region: process.env.AWS_REGION,
credentials: new AWS.Credentials(
credentials.accessKeyId,
credentials.secretAccessKey,
credentials.sessionToken
),
});
let endpoint = new urlParse(url).hostname.toString();
const item = {
input: variables
};
let req = new AWS.HttpRequest(url, process.env.AWS_REGION);
req.method = "POST";
req.headers.host = endpoint;
req.headers["Content-Type"] = "application/json";
req.body = JSON.stringify({
query: query,
operationName: operationName,
variables: item
});
let signer = new AWS.Signers.V4(req, "appsync", true);
signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate());
const data = await new Promise((resolve, reject) => {
const httpRequest = https.request({ ...req, host: endpoint }, (result) => {
result.on("data", (data) => {
resultdata = JSON.parse(data.toString());
if (resultdata.errors != null) {
throwOnErrors(query, variables, data);
reject(resultdata);
} else {
resolve(resultdata);
}
});
result.on("errors", (data) => {
reject(() => {
throwOnErrors(query, variables, data)
return JSON.parse(data.toString())
});
});
});
httpRequest.write(req.body);
httpRequest.end();
});
return data.data
};
不幸的是,有时,响应确实会被拒绝,并且错误总是如下所示:
SyntaxError: Unexpected token , in JSON at position 0
at JSON.parse (<anonymous>)
56 | result.on("data", (data) => {
57 |
> 58 | resultdata = JSON.parse(data.toString());
| ^
59 | if (resultdata.errors != null) {
60 | throwOnErrors(query, variables, data);
61 | reject(resultdata);
at IncomingMessage.<anonymous> (_tests/lib/graphql.js:58:27)
我真的不知道如何解决这个问题,因为有时承诺会得到解决,有时不会。
你们有什么建议给我吗?
提前致谢!
解决方案
你的'data'
回调可以运行多次,result
是一个流,所以
const httpRequest = https.request({ ...req, host: endpoint }, (result) => {
result.on("data", (data) => {
resultdata = JSON.parse(data.toString());
if (resultdata.errors != null) {
throwOnErrors(query, variables, data);
reject(resultdata);
} else {
resolve(resultdata);
}
});
result.on("errors", (data) => {
reject(() => {
throwOnErrors(query, variables, data)
return JSON.parse(data.toString())
});
});
});
需要更像
const httpRequest = https.request({ ...req, host: endpoint }, (response) => {
const chunks = [];
response.on("data", (data) => { chunks.push(data); });
response.on("end", () => {
resultdata = JSON.parse(Buffer.concat(chunks).toString());
if (resultdata.errors != null) {
throwOnErrors(query, variables, data);
reject(resultdata);
} else {
resolve(resultdata);
}
});
response.on("error", err => {
reject(() => {
throwOnErrors(query, variables, data)
return JSON.parse(data.toString())
});
});
});
推荐阅读
- php - 如何从 symfony 中删除树枝?
- r - 在 R 中获取二项式 GLMM 预测的置信区间
- django - 如何在 Django 中自动序列化 request.user?
- wordpress - 404 - 在 Wordpress 安装中找不到文件或目录
- python - 如何停止在 Windows 10 上后台运行的 Python 脚本?
- html - 在 SCSS 的 max 中使用 calc
- sql - Postgres - 行到列
- r - 将向量的每个元素并行应用于相应的数据帧行
- c# - c#中带有前缀读取问题的XML元素
- image - QGraphicsItem 使用鼠标位置调整大小并保持纵横比