备忘录:使用express-graphql在nodejs中返回GraphQL服务器

一边看这儿,一边做测试。
然而,关于在哪里采用还需要评估,如果是内部应用的话可以用较受欢迎的Rest(表现层状态转化)来进行对外公开,现在这样做可能更好一些。
(数据协同工具有时也没有提供适配器)。

WindowsServer2012 并带有 nodejs 16.x。

准备Node.js

首先,在node.js中安装所需部分。

npm install graphql express express-graphql -save

既然如此,我想要与Postgres协作,所以也安装了pg。
pool.js是我之前创建的内容,我进行了再利用。

const express = require('express');
const app = express();
const dbpool = require('./pool.js');
const expressGraphql = require('express-graphql').graphqlHTTP;
const { buildSchema } = require('graphql');
const port = 3000;

var pgSelect = {
    text: 'SELECT id,name from test where id=$1',
    values: [0],
}

// GraphQL schema
// クエリとしてはidを指定するuserを作成する。返り値はidとnameのセット
// ここで複数指定する事が出来る。
// スキーマ指定で!を使う事で必須とする事も出来る
var schema = buildSchema(`
 type Query {
 user(id: Int!): User
 },
 type User {
 id: Int
 name: String
 }
`);

// これはDB検索をして、1行目を返すファンクション
var getUser = async function(args) { 
    const reqid = args.id;
    pgSelect.values = [reqid];
    try{
        result = await dbpool.tx(async client => {
            const res1 = await client.query(pgSelect);
            return res1;
        });
    } catch(err) {
        return;
    }
    //console.log(result);
    return result.rows[0];
}

// GraphQL Root resolver
// ここでuserクエリではgetUserファンクションを利用するという指定。ファンクションの引数にはクエリが入る
var root = {
 user: getUser
};

// Create an express server and a GraphQL endpoint
// /graphalというアドレスに対して、先ほど作成したスキーマとリゾルバを利用する指定を行う
// graphiqlをtrueにすると次のクエリのテストを画面で出来る
app.use('/graphql', 
    expressGraphql({
        schema: schema,
        rootValue: root,
        graphiql: true
    })
);

app.listen(port, () => console.log('Express GraphQL Server Now Running On localhost:port/graphql'));

当最初执行const expressGraphql = require(‘express-graphql’);时,
报错类型错误:expressGraphql不是一个函数。
似乎需要更改为.graphqlHTTP。
或者可以使用const { graphqlHTTP } = require(‘express-graphql’)。

查询测试

当连接到 http://localhost:3000/graphql 时,会出现一个用于发送查询测试的页面。
在出现的页面的左上角创建查询。

query getSingleName($userID: Int!) { // 与えるパラメータを指定
 user(id: $userID) { //入力パラメータを使って実際のGraphQLのuserクエリに投げる
  id
  name
 }
}

请在下方输入您要为此查询提供的参数。

{"userID":1}

当按下运行按钮时,将返回以下结果。

{
  "data": { // 仕様は見ていないが、dataという名称は多分固定
    "user": { // クエリ名称だと思われる
      "id": 1,
      "name": "one"
    }
  }
}

由于GraphQL允许指定所需数据,这成为了它的一个优点,因此尝试指定查询以仅返回名字数据。

query getSingleName($userID: Int!) {
 user(id: $userID) {
        name
 }
}

在这种情况下,只会返回name。

{
  "data": {
    "user": {
      "name": "one"
    }
  }
}

如果要实际作为商用服务,可能还是使用阿波罗比较好吧?
暂时先到这里。

广告
将在 10 秒后关闭
bannerAds