Nest.js - 生产模式下的其他服务无法识别导入的服务

时间:2021-03-13 21:25:36

标签: nestjs

我正在尝试使用来自 AppModule 的 AppService 中 ModelsModule 的 ModelsService。 在开发模式下,一切正常。但在生产模式下,我收到一个错误:

[Nest] 16460   - 03/13/2021, 11:14:00 PM   [ExceptionsHandler] this.modelsService.countOnlineModels is not a function +1136ms
TypeError: this.modelsService.countOnlineModels is not a function
    at _.createAppStore (/Users/egor.kamenev/Desktop/camoncam/dist/static/server/serverBundle.js:1:76579)

app.service.tsx

import React from 'react';
import ReactDOMServer from 'react-dom/server';
import { createStore, Store } from 'redux';
import { Provider } from 'react-redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import { Inject, Injectable, forwardRef } from '@nestjs/common';
import { ModelsService } from './models/models.service';
import App from '../client/components/app/app';
import reducers from '../client/store/reducers';
import epics from '../client/store/epics';
import History from '../client/components/router/history';
import _merge from 'lodash/merge';

@Injectable()
export class AppService {
  constructor(
    @Inject(forwardRef(() => ModelsService))
    private readonly modelsService: ModelsService,
  ) {}

  async createAppStore(
    cookies: Record<string, string>,
    params: string,
  ): Promise<Store> {

    const calculatedState: CommonStateType = {
      main: _merge({}, initState.main, {
        onlineModelsCount: await this.modelsService.countOnlineModels(),
        allModelsCount: await this.modelsService.countAllModels(),
      }),
    };

    return createStore(
      reducers,
      calculatedState,
      composeWithDevTools(...epics),
    );
  }
}

app.module.ts

import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { join } from 'path';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ModelsModule } from './models/models.module';
import { ServeStaticModule } from '@nestjs/serve-static';
import { Models } from './models/schemas/modelTable.entity';

import { serverConfig } from './configs/appConfig';

@Module({
  imports: [
    ModelsModule,
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, serverConfig.clientPath),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

models.module.ts

import { Module } from '@nestjs/common';
import { ModelsService } from './models.service';
import { ModelsController } from './models.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Models } from './schemas/modelTable.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Models])],
  controllers: [ModelsController],
  providers: [ModelsService],
  exports: [ModelsService],
})
export class ModelsModule {}

webpack.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    mode: "production",
    entry: path.resolve(__dirname, './src/server/main.ts'),
    target: 'node',
    optimization: {
        minimize: true,
        minimizer: [
            `...`,
            new CssMinimizerPlugin(),
        ]
    },
    devtool: 'inline-source-map',
    externals: [nodeExternals({
        modulesFromFile: true,
    })],
    output: {
        filename: 'serverBundle.js',
        path: path.resolve(__dirname, 'dist/static/server'),
    },
    stats: 'errors-warnings',
    resolve: {
        modules: [__dirname, 'node_modules'],
        extensions: ["css", ".ts", ".tsx", ".scss", ".js", ".json"]
    },

    output: {
        publicPath: "/"
    },

    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].[contenthash].css',
            chunkFilename: '[id].[contenthash].css'
        })
    ],
    module: {
        rules: [
            {
                test: /\.ts(x?)$/,
                use: 'ts-loader',
                exclude: /node_modules/
            },
            {
                test: /\.scss$/i,
                use: [
                    MiniCssExtractPlugin.loader,
                    {
                        loader: 'css-loader',
                        options: {
                            modules: {
                                localIdentName: '[name]-[local]-[contenthash:base64:6]'
                            }
                        }
                    },
                    'sass-loader'
                ],
            },
            {
                test: /\.svg$/,
                loader: 'react-svg-loader',
                options: {
                    classIdPrefix: '[name]-[hash:8]__',
                    uniqueIdPrefix: true,
                }
            },
            {
                test: /\.(png|webp|jpe?g|avif)$/i,
                loader: 'file-loader',
                options: {
                    publicPath: '/images/',
                    outputPath: '../client/images',
                    name:'[name].[contenthash].[ext]'
                },
            }

        ]
    }
}

有人遇到过吗?在另一个模块服务中调用导入服务的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

问题出在 webpack 最小化器上。它为服务设置了错误的类名。

optimization.minimizer = false

决定了这个问题。