我正在做一件事,我基本上是在重构现有代码。我有两个文件: index和server。我的索引是:
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');我的服务器是这样的:
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()是异步的,所以它是合理的。实现这一目标的正确方法是什么?
发布于 2021-01-25 23:16:33
首先,请注意./server.js中的main()函数是async,并且您正在从该异步函数中定义module.exports。其次,在没有等待异步工作完成的情况下,从./index.js调用require('./server.js')。Node会立即将require()-d模块解析为空白对象(这就是您要获取的{} ),然后在任何异步或循环材质可用时扩展该对象。这就是为什么你会看到你所看到的。
哪些解决方案将或不适合您的用例将取决于您的AWS/直接调用应该如何工作的详细信息。这里有一个建议:
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());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();https://stackoverflow.com/questions/65886374
复制相似问题