如何在上下文中获取操作名称?在解析器中,我可以使用info
参数来获取该信息。
import { ApolloServer } from 'apollo-server'
const server = new ApolloServer({
context: ({ req }) => {
// Get query/mutation operation name like getAllUsers
}
})
server.listen()
答案 0 :(得分:1)
使用我在注释中建议的技术,我能够检索操作名称。
假设您有以下查询:
query foo {
baz {
id
name
}
}
req.body
有两个相关的键:
req.body.query
以字符串格式保存整个查询,并保留空格和回车符。虽然您可以从该字符串中检索操作名称,但将需要一些字符串操作;也就是说,将字符串变成一个对象,然后获取根级密钥(如果您在单个查询中触发多个操作,则可以是多个)。在上面的示例中,该键将包含以下字符串:'query foo {\n baz {\n id\n name\n }\n}'
。
req.body.operationName
保留您为查询提供的名称,为您命名的 IF 。在上面的示例中,此键将保留'foo'
(不是 'baz'
,它是 actual 操作的名称)。但是,您可以决定通过根据查询所包含的操作仔细命名查询来利用此功能(但是,如果您在一个查询中触发多个操作,则将无法使用)。如果您未命名查询,则此字段包含null
。
编辑:有关将方法1中检索的字符串转换为JS对象并检索实际操作名称的方法,请参见SO上的How to parse GraphQL request string into an object。
其他注意事项:
例如,方法2确实适合调试。假设您要记录特定查询的变量,可以为其命名并执行以下操作:
const server = new ApolloServer({
context: ({ req }) => {
if (req.body.operationName === 'debugMe') {
console.log(req.body.variables)
}
}
})
但是,由于方法2依赖于 client 命名查询,因此它不能可靠地用于业务逻辑目的。不管查询在客户端如何形成,只有方法1才能正确检索操作名称。
答案 1 :(得分:0)
传递给上下文的 req
包含 req.body.query,但是在测试使用 PostMan 发送 GraphQL 查询时,我发现我的 Apollo GraphQL 服务器的 req 参数不包含查询的名称(即使我命名它在上面正确指示的初始查询声明之后)。
不过,我的 req 对象确实包含 req.body.variables。
为了获取查询名称,我从正文中提取了前 40 个字符。您可以将其解析为第一个 {
或 (
或回车,但我只想能够看到查询/变异是什么,所以这对我有用:
context: async ({req, connection}) => {
...
...
let query = null;
// mutation or query, not a subscription:
const bodyQuery = req.body && req.body.query;
if (bodyQuery) {
query = req.body.query.substring(0,40);
} else {
query='No query passed in req body';
}
let variables = null;
if (req.body.variables) {
variables = req.body.variables;
}