Как правильно разделить мои index.js на server.js и app.js? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть текущий файл index.js, который работает нормально ... но для использования в моей стратегии тестирования я хочу разделить его на 2 файла: server.js и app.js

Яполучаю сообщение об ошибке, утверждающее, что мой app.js не является функцией .. что не так с моим кодированием?

index.js

import express from 'express';
import express_graphql from 'express-graphql';
import { buildSchema } from 'graphql';

// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
  type Query {
    message: String
  }
`);

// Root resolver
const root = {
  message: () => 'Hello World!'
};

// Create an express server and a GraphQL endpoint
const app = express();
app.use('/graphql', express_graphql({
  schema: schema,
  rootValue: root,
  graphiql: true
}));

/* eslint-disable no-console */
app.listen(4000, () => console.log('Express GraphQL Server Now running On localhost:4000/graphql'));

РАЗДЕЛЕНО В:

server.js

import app from './app';

/* eslint-disable no-console */
app.listen(4000, () => {
  console.log('Express GraphQL Server Now running On localhost:4000/graphql');
});

app.js

import express_graphql from 'express-graphql';
import { buildSchema } from 'graphql';
import express from 'express';

 export default function () {

  // Construct a schema, using GraphQL schema language
  const schema = buildSchema(`
    type Query {
      message: String
    }
  `);

  // Root resolver
  const root = {
    message: () => 'Hello World!'
  };

  // Create an express server and a GraphQL endpoint
  const app = express();
  app.use('/graphql', express_graphql({
    schema: schema,
    rootValue: root,
    graphiql: true
  }));

}

console.log

yarn start
yarn run v1.9.4
$ babel-node src/server.js
/Users/yves/Developments/WIP/NODE/nodeGraphQL/src/server.js:10
_app2.default.listen(4000, () => {
              ^

TypeError: _app2.default.listen is not a function
    at Object.<anonymous> (/Users/yves/Developments/WIP/NODE/nodeGraphQL/src/server.js:4:5)
    at Module._compile (module.js:653:30)
    at loader (/Users/yves/Developments/WIP/NODE/nodeGraphQL/node_modules/babel-register/lib/node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (/Users/yves/Developments/WIP/NODE/nodeGraphQL/node_modules/babel-register/lib/node.js:154:7)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Function.Module.runMain (module.js:694:10)
    at Object.<anonymous> (/Users/yves/Developments/WIP/NODE/nodeGraphQL/node_modules/babel-cli/lib/_babel-node.js:154:22)
    at Module._compile (module.js:653:30)
error Command failed with exit code 1.

спасибо за отзыв

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Вы должны return app в функции, которую вы экспортируете из файла app.js, импортировать ее в файл server.js и затем вызывать функцию следующим образом app().listen.Возвращаемое вами приложение - это инициализированная функция const app = express(), которая содержит свойство listen(), от которого зависит запуск вашего сервера.

0 голосов
/ 22 декабря 2018

действительный код согласно ответам @Elliot и @Ekpin ... (@Elliot был первым в строке)

app.js

import express_graphql from 'express-graphql';
import { buildSchema } from 'graphql';
import express from 'express';

 export default function () {

  // Construct a schema, using GraphQL schema language
  const schema = buildSchema(`
    type Query {
      message: String
    }
  `);

  // Root resolver
  const root = {
    message: () => 'Hello World!'
  };

  // Create an express server and a GraphQL endpoint
  const app = express();
  app.use('/graphql', express_graphql({
    schema: schema,
    rootValue: root,
    graphiql: true
  }));

  return app;

}

server.js

    import app from './app';

    /* eslint-disable no-console */
    app().listen(4000, () => {
      console.log('Express GraphQL Server Now running On localhost:4000/graphql');
    });
)
0 голосов
/ 22 декабря 2018

Ваш app.js экспортирует функцию , которую server.js импортирует.Но вы на самом деле не вызываете функцию.Учитывая эту структуру, ваш server.js должен выглядеть примерно так:

import app from './app';

app().listen(4000, () => {
    // ....
});

Тем не менее, у вас также есть проблема в том, что экспортируемая функция app.js фактически не возвращает значение, этосоздает экспресс-сервер, но не возвращает егоТак что вам также нужно настроить app.js, добавив возврат в конец тела метода:

  const app = express();
  // ....

  return app;
}

Дайте этому шанс!

...