NestJS+Webpack环境下Bull.js无法获取导出函数的问题
解决NestJS+Webpack编译Bull Worker时的导出兼容问题
问题场景
我的NestJS应用中有如下TypeScript Worker代码:
async function bootstrap(job: Job, done: DoneCallback) { //... } export default bootstrap;
编译为JS文件后,导出语句为exports["default"] = bootstrap;,但Bull.js抛出错误:
/usr/src/app/node_modules/bull/lib/job.js:516 reject(new Error(failedReason)); ^ Error: origProcessor.apply is not a function
手动在编译后的JS文件中添加module.exports = bootstrap;后即可正常运行,现需通过Webpack配置解决该问题,且保留Webpack作为编译工具。
环境信息
- bull版本:4.10.4
- webpack版本:5.76.3
- nestjs版本:9.3.12
解决方案
方法1:调整Webpack Output配置
修改Webpack配置文件,在output字段中添加libraryTarget和libraryExport,让Webpack将默认导出直接映射到module.exports:
const path = require('path'); module.exports = { // 其他已有配置 target: 'node', // 必须指定为node环境,避免Webpack注入浏览器相关代码 output: { filename: 'worker.js', // 你的Worker输出文件名 path: path.resolve(__dirname, 'dist'), // 输出目录 libraryTarget: 'commonjs', libraryExport: 'default', }, };
该配置会让Webpack编译后生成module.exports = bootstrap;的导出语句,完全适配Bull.js对CommonJS模块的读取逻辑。
方法2:修改TypeScript导出语法
若不想调整Webpack配置,可直接修改Worker代码的导出方式,使用TypeScript的export =语法替代默认导出:
async function bootstrap(job: Job, done: DoneCallback) { //... } export = bootstrap;
TypeScript编译器会直接将该语法编译为module.exports = bootstrap;,无需额外Webpack配置。
方法3:适配NestJS CLI的Webpack配置
如果项目使用@nestjs/cli管理,可通过自定义Webpack配置文件修改输出规则:
- 在项目根目录创建
webpack.config.js:
module.exports = function (config) { config.output .libraryTarget('commonjs') .libraryExport('default'); return config; };
- 在
nest-cli.json中指定该配置文件:
{ "compilerOptions": { "webpackConfig": "webpack.config.js" } }
内容的提问来源于stack exchange,提问作者Nícolas Amarante
相关产品推荐
相关产品推荐

