2017-07-25 29 views
2

我按照這graphql教程,一切都會好起來,直到我嘗試使用dataloaders。loader.load()函數必須調用一個值,但得到:undefined

我server.js是:

const start = async() => { 
    const mongo = await connectMongo(); 

    const buildOptions = async req => { 
    const user = await authenticate(req, mongo.Users); 
    return { 
     context: { 
     dataloaders: buildDataloaders(mongo), 
     mongo, 
     user 
     }, 
     schema 
    }; 
    }; 
    app.use('/graphql', bodyParser.json(), graphqlExpress(buildOptions)); 
    app.use(
    '/graphiql', 
    graphiqlExpress({ 
     endpointURL: '/graphql', 
     passHeader: `'Authorization': 'bearer [email protected]'` 
    }) 
); 
    app.use('/', expressStaticGzip('dist')); 
    app.use('/attendance', expressStaticGzip('dist')); 
    app.use('/login', expressStaticGzip('dist')); 

    spdy.createServer(sslOptions, app).listen(process.env.PORT || 8080, error => { 
    if (error) { 
     console.error(error); 
     return process.exit(1); 
    } else { 
     console.info(
     `App available at https://localhost:${process.env.PORT || 3000}` 
    ); 
    } 
    }); 
}; 

我複製和粘貼dataloaders.js:

const DataLoader = require('dataloader'); 

async function batchUsers(Users, keys) { 
    return await Users.find({ _id: { $in: keys } }).toArray(); 
} 

module.exports = ({ Users }) => ({ 
    userLoader: new DataLoader(keys => batchUsers(Users, keys), { 
    cacheKeyFn: key => key.toString() 
    }) 
}); 

而且我resolvers.js:

export default { 
    Query: { 
    allLinks: async (root, data, { mongo: { Links } }) => 
     Links.find({}).toArray() 
    }, 
    Mutation: { 
    createLink: async (root, data, { mongo: { Links }, user }) => { 
     const newLink = Object.assign({ postedById: user && user._id }, data); 
     const response = await Links.insert(newLink); 
     return Object.assign({ id: response.insertedIds[0] }, newLink); 
    }, 
    createUser: async (root, data, { mongo: { Users } }) => { 
     const newUser = { 
     name: data.name, 
     email: data.authProvider.email.email, 
     password: data.authProvider.email.password 
     }; 
     const response = await Users.insert(newUser); 
     return Object.assign({ id: response.insertedIds[0] }, newUser); 
    }, 
    signinUser: async (root, data, { mongo: { Users } }) => { 
     const user = await Users.findOne({ email: data.email.email }); 
     if (data.email.password === user.password) { 
     return { token: `token-${user.email}`, user }; 
     } 
    } 
    }, 

    Link: { 
    id: root => root._id || root.id, 
    postedBy: async ({ postedById }, data, { dataloaders: { userLoader } }) => { 
     return await userLoader.load(postedById); 
    } 
    }, 
    User: { 
    id: root => root._id || root.id 
    } 
}; 

當我嘗試讓我的allLinks我得到了錯誤:

TypeError: The loader.load() function must be called with a value,but got: undefined.

任何人都可以幫助我嗎?

+0

唯一對我來說似乎有意義的是,您最初創建鏈接的用戶已被刪除。是這樣嗎? –

回答

3

所以我能夠通過創建與用戶的鏈接,從Mongo數據庫中刪除用戶,然後查詢鏈接的postedBy屬性來重現錯誤。

我建議放棄所有鏈接並重新創建用戶(註冊+登錄),創建新鏈接,然後查詢postedBy字段。

+0

謝謝,我放棄了它的工作鏈接 –

相關問題