【发布时间】:2023-01-07 15:41:18
【问题描述】:
在我的server/index.js我正在尝试访问的文件aws-appsync查询如THIS文档中所示来自 NodeJS 的 AWS GraphQL.我正在寻找的是访问我之前创建的 aws-appsync 服务来制作GQL查询并得到相应的回应。我的应用同步访问也与aws-cognito有关我是架构上的用户。所以我试图通过使用aws-cognito访问appsync服务我是从服务本身获取数据。但得到错误
E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\dist-cjs\defaultProvider.js:13
throw new property_provider_1.CredentialsProviderError("Could not load credentials from any providers", false);
^ CredentialsProviderError: Could not load credentials from any providers
at E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\dist-cjs\defaultProvider.js:13:11
at E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\chain.js:11:28
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async coalesceProvider (E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\memoize.js:14:24)
at async SignatureV4.credentialProvider (E:\myProjectName\node_modules\@aws-sdk\credential-provider-node\node_modules\@aws-sdk\property-provider\dist-cjs\memoize.js:33:24)
at async SignatureV4.signRequest (E:\myProjectName\node_modules\@aws-sdk\signature-v4\dist-cjs\SignatureV4.js:86:29) at async handler (file:///E:/myProjectName/server/index.js:86:20) { tryNextLink: false }
让我分享我的代码
import express from 'express';
const app = express();
import path from 'path';
const PORT = process.env.PORT || 3000;
import fs from 'fs';
import { fileURLToPath } from 'url';
import crypto from '@aws-crypto/sha256-js';
import { defaultProvider } from '@aws-sdk/credential-provider-node';
import { SignatureV4 } from '@aws-sdk/signature-v4';
import { HttpRequest } from '@aws-sdk/protocol-http';
import { default as fetch, Request } from 'node-fetch';
const { Sha256 } = crypto;
const GRAPHQL_ENDPOINT = 'https://myawsendpoint.amazonaws.com/graphql'
const AWS_REGION = 'us-east-1'
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
app.use(express.static(
path.resolve(__dirname, '..', 'build')
));
app.listen(PORT, (error) => {
if (error) {
return console.log('Error during app startup', error);
}
console.log("listening on " + PORT + "...");
});
const indexPath = path.resolve(__dirname, '..', 'build', 'index.html');
const query = `query MyQuery {
listCountrys {
items {
countryName
}
}
}
const handler = async (event) => {
console.log(`EVENT: ${JSON.stringify(event)}`);
const endpoint = new URL(GRAPHQL_ENDPOINT);
console.log("endpoint", endpoint)
const signer = new SignatureV4({
credentials: defaultProvider({ timeout: 2000, maxRetries: 2 }),
region: AWS_REGION,
service: 'appsync',
sha256: Sha256
});
const requestToBeSigned = new HttpRequest({
method: 'POST',
headers: {
'Content-Type': 'application/json',
host: endpoint.host
},
hostname: endpoint.host,
body: JSON.stringify({ query }),
path: endpoint.pathname
});
console.log("=== requestToBeSigned", requestToBeSigned)
const signed = await signer.sign(requestToBeSigned);
const request = new Request(endpoint, signed);
let statusCode = 200;
let body;
let response;
try {
response = await fetch(request);
body = await response.json();
console.log("=== body response", body)
if (body.errors)
statusCode = 400;
} catch (error) {
console.log("=== body response error", error)
statusCode = 500;
body = {
errors: [
{
message: error.message
}
]
};
}
return {
statusCode,
body: JSON.stringify(body)
};
}
app.get('^/public/posts/:id', (req, res, next) => {
handler()
});
});
架构:
@aws_iam
@aws_cognito_user_pools
listCountrys(filter: ModelCountryFilterInput, limit: Int, nextToken: String): ModelCountryConnection
我不知道我实际上错过了什么。我提供的正是文档中所说的内容。谁能赐教吗?提前致谢。
【问题讨论】:
标签: node.js express amazon-cognito aws-appsync