备忘录:使用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"
}
}
}
如果要实际作为商用服务,可能还是使用阿波罗比较好吧?
暂时先到这里。