简体   繁体   中英

How to dynamically import module for nitro on nuxt app

Im trying to dynamically load modules from a nitro server in a nuxt app, but I get the following error:

Cannot find module projectpath/.nuxt/services/listing imported from projectpath/.nuxt/dev/index.mjs

This is the snippet of code Im using for the handler where the dynamic import should take place:

export default defineEventHandler(async (event) => {
    const { method, resource, paramValue } = parseRequestResource(event.node.req)
    let ServiceInstance = services[resource]

    if (ServiceInstance) {
        return callResourceMethod(ServiceInstance, method, paramValue, event)
    } else {

        try {
            ServiceInstance = await import(`../services/${resource}`)
        } catch (error) {
            const Proto = Object.assign({}, Service.prototype, { tableName: resource })
            ServiceInstance = Object.create(Proto)
            services[resource] = ServiceInstance
        }

        return callResourceMethod(ServiceInstance, method, paramValue, event)
    }
})

How can I this to work? Is there some feature that nitro/nuxt have where I can do this?

I was able to achieve this functionality by using a nitro plugin. However the files being imported need to be *.mjs.

import fs from 'fs'
import { resolve } from 'path'

export default defineNitroPlugin(async (nitroApp) => {
    const __dirname = resolve()
    const servicesFolderPath = `${__dirname}/server/services`
    const serviceFiles = fs.readdirSync(servicesFolderPath)
    const services = {}

    for (const fileName of serviceFiles) {
        if (fileName == '__proto__.mjs') continue

        try {
            const moduleName = fileName.split('.')[0]
            const module = await import(`${servicesFolderPath}/${fileName}`)
            services[moduleName] = module.default
        } catch (error) {
            console.log(error);
        }
    }

    nitroApp.$services = services
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM