如何从数据库中获取数据以供 graphql 中的解析器使用

How to fetch the data from database for resolver in graphql

我创建了两个文件

index.js

const {ApolloServer,gql} = require('apollo-server');
const fs = require('fs');
const path = require('path');

const typedefs = gql`
        type Query {
            info: String!
            ask: [Person!]
        }
        type Person {
            name: String!
            age: Int!
        }
`;
const resolvers = {
    Query: {
        info: () => `Hello World from Linux Fan`,
        ask: () => {
            return [fs.readFileSync(__dirname+path.join('/db.db'),'utf-8')]
        }
    }
}

const server = new ApolloServer({
    typedefs,
    resolvers
}).listen().then(({url}) => console.log(url)).catch(err => console.log(err));

还有一个用于存储数据库的文件

db.db

{
    name:"Linux Age",
    age: 19
}

但问题是每次我进行查询以获取姓名和年龄时,如

{
  info
  ask{
    name
  }
}

存在一个问题

“不能为不可空字段 return null Person.name”

如何解决??

根据 Node.js 文档 (https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options),fs.readFileSync() returns 一个字符串或缓冲区。然而,从模式中,ask() returns 一个 Person 类型的数组,它是一个对象。 fs.readFileSync() 的结果在返回之前应该转换为对象:

ask: () => {
  const person = JSON.parse(JSON.stringify(
    fs.readFileSync(__dirname + path.join('/db.db'), 'utf-8').toString()
  ));
  return [person];
}

请注意,我在使用 JSON.parse() 解析它之前调用了 JSON.stringify()。原因是文件 db.db 有一个 javascript 对象(键,名字和年龄,没有双引号)而不是 JSON 对象(带引号的键,如下所示):

{
  "name":"Linux Age",
  "age": 19
}

否则,JSON.parse() 会在解析无效的 JSON 格式时出现问题:

{
  name:"Linux Age",
  age: 19
}

此外,调用readFileSync()后需要toString()将Buffer转为字符串:

fs.readFileSync(__dirname + path.join('/db.db'), 'utf-8').toString()