Запрос Dgraph с переменной UID - PullRequest
0 голосов
/ 17 января 2020

Следующий код предназначен для запроса к серверу Dgraph значений, связанных с указанным узлом c, аналогично поиску строки по первичному ключу в реляционной базе данных.

const dgraph = require("dgraph-js");
const grpc = require("grpc");
const clientStub = new dgraph.DgraphClientStub( grpc.credentials.createInsecure() );
const dgraphClient = new dgraph.DgraphClient(clientStub);

const lookupNode = `query nodeValues($id:uid) {
    nodeValues(func: uid($id)) {
        value1,
        value2,
        value3
    }
}`;
const res = await dgraphClient.newTxn().queryWithVars(query, {$id: "0x13");

Это повышает Error: 2 UNKNOWN: Type "uid" not supported при выполнении. Если переменная $id набрана как string или int, результаты не найдены. Как сделать один запрос по UID узла с переменными?

1 Ответ

0 голосов
/ 31 января 2020

Тип переменной запроса $id в этом случае должен быть string. Было бы полезно увидеть фактический результат, который у вас есть. Тем не менее, я предполагаю, что в вашем примере есть проблема с асинхронными функциями. Следующий код дает мне желаемый вывод { nodeValues: [ { value1: 'value1' } ] }:

const dgraph = require("dgraph-js");
const grpc = require("grpc");
const clientStub = async () => new dgraph.DgraphClientStub("localhost:9080", grpc.credentials.createInsecure());
const dgraphClient = async (clientStub) => new dgraph.DgraphClient(clientStub);

async function createData(dgraphClient) {
    const txn = dgraphClient.newTxn();
    try {
        const p = {uid: "0x13", value1: "value1"};
        const mu = new dgraph.Mutation();
        mu.setSetJson(p);
        await txn.mutate(mu);
        await txn.commit();
    } finally {
        await txn.discard();
    }
}

const lookupNode = `query nodeValues($id:string) {
    nodeValues(func: uid($id)) {
        value1,
        value2,
        value3
    }
}`;
const res = async (dgraphClient) => {
    const response = await dgraphClient.newTxn().queryWithVars(lookupNode, {$id: "0x13"});
    return response.getJson();
};

const main = async () => {
    const stub = await clientStub();
    const client = await dgraphClient(stub);
    await createData(client);
    return await res(client);
};

main().then((res) => {
    console.log(res);
}).catch((e) => {
    console.log("ERROR: ", e);
});

На основе примера от официально поддерживаемого клиента: https://github.com/dgraph-io/dgraph-js/blob/master/examples/simple/index.js

...