微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在graphql

如何解决如何在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
  }
}

存在问题,说

“不能为不可为空的字段 Person.name 返回空值”

Error

如何解决??

解决方法

根据 Node.js 文档 (https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options),fs.readFileSync() 返回字符串或缓冲区。然而,从模式中, ask() 返回一个 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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。