Search code examples
nuxt.jsnuxtjs3

When I register my Nuxt Nitro Plugin in module.ts fails


I import the defineNitroPlugin from '#build/types/nitro-imports' to create a nitro plugin. My nitro plugin code is shown below. I then register the plugin in my module.ts file. However, when I build the project I get an error by adding the nitro hook i.e. nitro.hook( etc.


                 //src/plugins/kafka-plugin.ts -- nitro plugin
                 import _ from 'lodash'
                 import { useRuntimeConfig } from '#imports
                 import { defineNitroPlugin } from '#build/types/nitro-imports';
                 import { kafkaFactory } from 'kafka-factory'
               
                 const kafkaFactoryInstance = (kafkaOptions: any) => {
                   return kafkaFactory(kafkaOptions)
                 };  
   
                 export default defineNitroPlugin((nitroApp) => {
                   console.log('Nitro plugin', nitroApp)
                   const config = useRuntimeConfig()
                   nitroApp.hooks.hook('request', (event) => {
                   const kafkaOptions = config.public.kafkaOptions
                   const kafkaFactory = kafkaFactoryInstance(kafkaOptions)
                   event.context.kafkaFactory = kafkaFactory
                 })   
               })

Here is the module.ts file in src/module.ts


                 import { defineNuxtModule, createResolver } from '@nuxt/kit';

                 export default defineNuxtModule({
                    meta: {
                       name: 'kafka-module',
                      configKey: 'kakfaProperties',
                  }, 
                  defaults: {
                    kafkaOptions: {
                      appName: 'kafka-module',
                     // my kafka options...
                   },
                },
                setup(moduleOptions, nuxt) {
                const { resolve } = createResolver(import.meta.url);
                const nuxtOptions = nuxt.options;
                const mergedOptions = _.merge(
                    nuxtOptions.runtimeConfig.public.kakfaProperties || {},
                    moduleOptions
                );
                nuxtOptions.runtimeConfig.public.kakfaProperties = mergedOptions;
                // adding this makes it fail
                nuxt.hook('nitro:config', (nitro) => {
                // ensure `nitro.plugins` is initialized
                nitro.plugins = nitro.plugins || []

                 // add your custom plugin
                nitro.plugins.push(resolve('./plugins/kafka-plugin'))
              })
            }

          });

When I run npm run prepack i.e. nuxt-module-build build, it fails with the following error. I added the code to register the nitro plugin and then it to fail.

ERROR Vue app aliases are not allowed in server runtime. [importing #build/types/nitro-imports from ../src/plugins/kafka-plugin.ts] 7:08:41 AM [nitro 10:46:08 PM] ERROR Error: Could not load /Users/reuz/projects/kafka-module/playground/.nuxt/types/nitro-imports (imported by src/plugins/kafka-plugin.ts): ENOENT: no such file or directory, open '/Users/reuz/projects/kafka-module/playground/.nuxt/types/nitro-imports'

Why is it failing even though defineNitroPlugin is in the package? I do not know why it is looking for it in playground .nuxt folder. It also complains because I've imported the nitro package with Vue app aliases cannot be imported in server runtime. How then can I define the plugin?


Solution

  • I made the error of importing defineNuxtPlugin from '@nuxt/app' instead of '#imports' and that caused it to fail