typescript - ฟังก์ชัน API GraphQL บน Azure กับ Cosmos DB ส่งค่ากลับ URL ไม่ถูกต้อง
ฉันได้สร้างฟังก์ชัน GraphQL API แบบไม่มีเซิร์ฟเวอร์ด้วย Azure functions และได้เชื่อมต่อกับ Cosmos DB แล้ว ฉันพยายามแก้ไขปัญหาที่บอกว่า URL ไม่ถูกต้อง (ตัดตอนด้านล่าง) มาหนึ่งสัปดาห์แล้ว แต่จนถึงตอนนี้ฉันก็ยังไม่รู้ว่ามันเกิดอะไรขึ้น เมื่อฉันรันฟังก์ชัน graphql ในเครื่อง มันทำงานได้ กรุณาถามหากคุณต้องการให้เพิ่มข้อมูลอะไรในโพสต์นี้
นี่คือไฟล์ index.ts ของฉัน -
import { ApolloServer } from "apollo-server-azure-functions"
import { BolDataSource } from "../data-sources/models/bol-datasource";
import { typeDefs } from './graphql-schema';
const resolvers = {
Query : {
users: async (parent, args, { dataSources }, info) => {
return dataSources.bolGraphQlApi.getUsers();
}
},
Mutation: {
createUser: async(parent, args, { dataSources }, info) => {
return dataSources.bolGraphQlApi.createUser(args);
}
}
}
const dataSources = () => ({ bolGraphQlApi: new BolDataSource() });
const server = new ApolloServer({ typeDefs, resolvers, dataSources });
export default server.createHandler();
แหล่งข้อมูลอพอลโล
import { DataSource } from "apollo-datasource";
import { Container, CosmosClient, SqlQuerySpec } from "@azure/cosmos";
//below values stored in local.settings.json file
const endpoint = process.env["COSMOS_DB_ENDPOINT"];
const key = process.env["COSMOS_DB_KEY"];
const containerId = process.env["COSMOS_CB_CONTAINER_ID"];
const databaseId = process.env["COSMOS_DB_DATABASE_ID"];
const cosmosConnectionString = process.env["COSMOS_DB_CONNECTION_STRING"];
export class BolDataSource extends DataSource {
constructor() {
super();
}
initCosmosDb = async (): Promise<Container> => {
const cosmosClient = new CosmosClient({ endpoint, key });
//const cosmosClient = new CosmosClient(cosmosConnectionString);
const cosmosContainer = cosmosClient.database(databaseId).container(containerId);
return cosmosContainer;
}
getUsers = async (parent, args) => {
console.log('Get Users');
const querySpec: SqlQuerySpec = {
query: "SELECT * FROM c",
parameters: []
};
const container = await this.initCosmosDb();
const { resources: results } = await container.items.query(querySpec).fetchAll();
console.log(results.toString);
return results;
};
}
export default BolDataSource;
นี่คือลัพธ์ที่ฉันได้รับเมื่อฉันรัน graphql api จาก Postman -
บอกว่าสถานะคือ 200 และด้านล่างคือข้อความแสดงข้อผิดพลาดของ GraphQL -
{
"errors": [
{
"message": "Invalid URL",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"users"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"input": "undefined",
"code": "ERR_INVALID_URL",
"stacktrace": [
"TypeError [ERR_INVALID_URL]: Invalid URL",
" at new NodeError (node:internal/errors:372:5)",
" at URL.onParseError (node:internal/url:553:9)",
" at new URL (node:internal/url:629:5)",
" at checkURL (C:\\home\\site\\wwwroot\\node_modules\\@azure\\cosmos\\dist\\index.js:8227:12)",
" at new CosmosClient (C:\\home\\site\\wwwroot\\node_modules\\@azure\\cosmos\\dist\\index.js:8881:26)",
" at BolDataSource.<anonymous> (C:\\home\\site\\wwwroot\\dist\\data-sources\\models\\bol-datasource.js:25:34)",
" at Generator.next (<anonymous>)",
" at C:\\home\\site\\wwwroot\\dist\\data-sources\\models\\bol-datasource.js:8:71",
" at new Promise (<anonymous>)",
" at __awaiter (C:\\home\\site\\wwwroot\\dist\\data-sources\\models\\bol-datasource.js:4:12)"
]
}
}
}
],
"data": null
}
นี่คือที่ที่ฉันเอา URL ของฟังก์ชันมาจาก -
คำตอบ #1
นี่เป็นปัญหาเกี่ยวกับการตั้งค่าของแอปพลิเคชันที่หายไปในพอร์ทัล Azure ฉันได้ตั้งค่าไฟล์ local.settings.json พร้อมกับสตริงการเชื่อมต่อของ Cosmos DB แต่ข้อมูลเดียวกันไม่ได้ถูกคัดลอกไปยังการตั้งค่าแอปฟังก์ชัน Azure ระหว่างการปรับใช้ ไม่ใช่การตั้งค่าทั้งหมดที่จะถูกคัดลอกไประหว่างการปรับใช้ จะมีการตั้งค่าบางอย่างที่ต้องทำด้วยตนเองหลังจากการปรับใช้
