Попытка создать проект на основе https://github.com/serverless/serverless-graphql/blob/master/app-backend/dynamodb/handler.js. Код работает хорошо, но по какой-то причине я всегда получаю предупреждение в журнале о context.done called twice.
import { graphqlLambda, graphiqlLambda, LambdaHandler } from 'apollo-server-lambda'
import lambdaPlayground from 'graphql-playground-middleware-lambda'
import { makeExecutableSchema } from 'graphql-tools'
import { resolvers } from './resolvers'
const typeDefs = require('./schema.gql')
const schema = makeExecutableSchema({ typeDefs, resolvers, logger: console })
export const graphqlHandler: LambdaHandler = async (event, context) => {
const handler = graphqlLambda({ schema })
return handler(event, context, (error: Error | undefined, output: any) => {
output.headers['Access-Control-Allow-Origin'] = '*'
context.done(error, output)
})
}
export const playgroundHandler = lambdaPlayground({
endpoint: '/graphql',
})
export const graphiqlHandler: any = graphiqlLambda({
endpointURL: '/graphql',
})
Этот код дает мне следующий результат:
Serverless: POST /graphql (λ: graphql)
Serverless: [200] {"statusCode":200,"headers":{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},"body":"{\"data\":{\"getUserInfo\":\"ads\"}}"}
Serverless: Warning: context.done called twice within handler 'graphql'!
Что еще более странно, если я прокомментирую вызов context.done, я получаю следующий результат (вызов останавливается, как и ожидалось):
Serverless: POST /graphql (λ: graphql)
Serverless: Warning: context.done called twice within handler 'graphql'!





Похоже, об этом уже сообщалось: https://github.com/dherault/serverless-offline/issues/405
Я столкнулся с подобной проблемой. Попробуйте удалить async в своей функции, если вы не собираетесь использовать ожидание. Похоже, что функция ждет, пока вы не вызовете callback или context.done, когда async отсутствует. Но он проходит полностью с ключевым словом async. Однако, когда он выполняется, все, что он возвращает в конце вашей функции, вызывает context.done. Вот пример рабочего кода.
Позвольте мне также поделиться двумя полезными ресурсами о Перезвоните и контекст от aws lambda.
export const handler = (
{
headers,
pathParameters: pathParams,
queryStringParameters: queryParams,
body,
},
context,
callback
) => {
context.callbackWaitsForEmptyEventLoop = false;
const data = JSON.parse(body);
const params = {
TableName: process.env.EVENT_TABLE,
Item: {
id: uuid.v4(),
title: data.title,
creationDate: new Date().getTime(),
},
};
dynamoDb.put(params, (err, data) => {
if (err) {
callback(err);
}
callback(null, {
statusCode: 200,
body: JSON.stringify(data),
});
});
};