index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { parse as urlParse } from 'url';
  2. import { HeaderMap } from '../utils/HeaderMap.js';
  3. export function expressMiddleware(server, options) {
  4. server.assertStarted('expressMiddleware()');
  5. const defaultContext = async () => ({});
  6. const context = options?.context ?? defaultContext;
  7. return (req, res, next) => {
  8. if (!req.body) {
  9. res.status(500);
  10. res.send('`req.body` is not set; this probably means you forgot to set up the ' +
  11. '`json` middleware before the Apollo Server middleware.');
  12. return;
  13. }
  14. const headers = new HeaderMap();
  15. for (const [key, value] of Object.entries(req.headers)) {
  16. if (value !== undefined) {
  17. headers.set(key, Array.isArray(value) ? value.join(', ') : value);
  18. }
  19. }
  20. const httpGraphQLRequest = {
  21. method: req.method.toUpperCase(),
  22. headers,
  23. search: urlParse(req.url).search ?? '',
  24. body: req.body,
  25. };
  26. server
  27. .executeHTTPGraphQLRequest({
  28. httpGraphQLRequest,
  29. context: () => context({ req, res }),
  30. })
  31. .then(async (httpGraphQLResponse) => {
  32. for (const [key, value] of httpGraphQLResponse.headers) {
  33. res.setHeader(key, value);
  34. }
  35. res.statusCode = httpGraphQLResponse.status || 200;
  36. if (httpGraphQLResponse.body.kind === 'complete') {
  37. res.send(httpGraphQLResponse.body.string);
  38. return;
  39. }
  40. for await (const chunk of httpGraphQLResponse.body.asyncIterator) {
  41. res.write(chunk);
  42. if (typeof res.flush === 'function') {
  43. res.flush();
  44. }
  45. }
  46. res.end();
  47. })
  48. .catch(next);
  49. };
  50. }
  51. //# sourceMappingURL=index.js.map