首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对模块导出/要求感到困惑

对模块导出/要求感到困惑
EN

Stack Overflow用户
提问于 2021-01-25 22:09:13
回答 1查看 100关注 0票数 0

我正在做一件事,我基本上是在重构现有代码。我有两个文件: index和server。我的索引是:

代码语言:javascript
复制
const md5File = require('md5-file');
const fs = require('fs');
const path = require('path');
const ignoreStyles = require('ignore-styles');
const register = ignoreStyles.default;
const extensions = ['.gif', '.jpeg', '.jpg', '.png', '.svg'];
...
require('@babel/polyfill');
require('@babel/register')({
  ignore: [/\/(build|node_modules)\//],
  presets: ['@babel/preset-env', '@babel/preset-react'],
  plugins: [
    '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-proposal-class-properties',
    'dynamic-import-node',
    'react-loadable/babel'
  ]
});
// Now that the nonsense is over... load up the server entry point
require('./server');

我的服务器是这样的:

代码语言:javascript
复制
import path from 'path';
import Loadable from 'react-loadable';
...
const main = async () => {
  // tell React Loadable to load all required assets
  await Loadable.preloadAll();

  process.on('unhandledRejection', err => {
    console.error(err);
    process.exit(1);
  });

  const server = fastify(config.fastify);
  server.register(require('./routes'), config);
  server.register(fastifyStatic, {
    root: path.resolve(__dirname, '../build')
  });
  if (require.main === module) {
    // called directly i.e. $ node index.js
    const address = await server.listen(config.address);
    // start listening - ROCK AND ROLL!
    server.log.info(`Server running at: ${address}`);
  } else {
    // required as a module => executed on aws lambda
    module.exports = server;
  }
};
main();

在本地执行时,服务器应该运行REST服务,并导出inject方法的服务器实例。这样,在AWS Lambda下运行时,代理可以附加到它。

我以前多次使用过相同的设置。只有这两个部分在同一个文件中,例如服务器在索引中。单个文件版本工作得很好- require.main比较告诉程序它是如何运行的,当在Lambda下运行时,module.exports使用所需的inject方法公开服务器实例server,并通过直接调用运行REST服务。

但是,由于这一次我需要导入react-loadable,所以我将文件拆分为两部分。

现在,我可能需要弄清楚代码是如何在index.js中运行的,因为server.js没有被直接调用,然后将它传递给服务器。这可能并不太难。

我的主要问题是,当我从索引执行console.log(require('./server'))时,它会打印{}。虽然服务器实例创建成功,但inject()存在;不知何故,我无法从server.js文件中导出它并正确地导入到index.js中,因此无法从index.js重新导出它以供代理附加。

很明显,我做错了什么。在我看来,我的请求没有服务器实例,因为实例是在请求完成后创建的。因为我的main()是异步的,所以它是合理的。实现这一目标的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-01-25 23:16:33

首先,请注意./server.js中的main()函数是async,并且您正在从该异步函数中定义module.exports。其次,在没有等待异步工作完成的情况下,从./index.js调用require('./server.js')。Node会立即将require()-d模块解析为空白对象(这就是您要获取的{} ),然后在任何异步或循环材质可用时扩展该对象。这就是为什么你会看到你所看到的。

哪些解决方案将或不适合您的用例将取决于您的AWS/直接调用应该如何工作的详细信息。这里有一个建议:

代码语言:javascript
复制
const md5File = require('md5-file');
const fs = require('fs');
const path = require('path');
const ignoreStyles = require('ignore-styles');
const register = ignoreStyles.default;
const extensions = ['.gif', '.jpeg', '.jpg', '.png', '.svg'];
// ...
require('@babel/polyfill');
require('@babel/register')({
  ignore: [/\/(build|node_modules)\//],
  presets: ['@babel/preset-env', '@babel/preset-react'],
  plugins: [
    '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-proposal-class-properties',
    'dynamic-import-node',
    'react-loadable/babel'
  ]
});

process.env.serverRunLocally = require.main === module;

// Now that the nonsense is over... load up the server entry point
require('./server').then(listen => listen());
代码语言:javascript
复制
import path from 'path';
import Loadable from 'react-loadable';
// ...
const main = async () => {
  // tell React Loadable to load all required assets
  await Loadable.preloadAll();

  process.on('unhandledRejection', err => {
    console.error(err);
    process.exit(1);
  });

  const server = fastify(config.fastify);
  server.register(require('./routes'), config);
  server.register(fastifyStatic, {
    root: path.resolve(__dirname, '../build')
  });
  if (process.env.serverRunLocally) {
    // called directly i.e. $ node index.js
    return () => {
       const address = await server.listen(config.address);
       // start listening - ROCK AND ROLL!
       server.log.info(`Server running at: ${address}`);
    }
  } else {
    // required as a module => executed on aws lambda
    return server;
  }
};

module.exports = main();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65886374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档