导入模块,库函数出错

Posted

技术标签:

【中文标题】导入模块,库函数出错【英文标题】:Importing a module, error with library functions 【发布时间】:2021-12-20 18:43:36 【问题描述】:

我目前正在使用 NodeJS。

我正在尝试将一个模块导入到一个组件函数中,并且一切都执行得很好,但我仍然在服务器控制台中收到此错误:

error - src\modules\accountFunctions.js (15:35) @ Object.User.GetData
TypeError: _cookieCutter.default.get is not a function

cookieCutter.get 实际上是一个函数,并且按预期工作

import cookieCutter from 'cookie-cutter'
import  useSelector, useDispatch  from 'react-redux'
import  useRouter  from 'next/router'
import  accountActions  from '../store/account'

const Auth = require('./auth.module')

const User = 

User.GetData = async () => 
    const route = useRouter()
    const userData = useSelector((state) => state.user)
    const dispatch = useDispatch()

    const sessionId = cookieCutter.get('session')

    if (sessionId && userData.username === '') 
        const userExist = await Auth.loadUserInformation()
        if (userExist.result === false) 
            route.push('/login')
            return false
        
        dispatch(accountActions.updateAccountInformation(userExist.data))
        return true
     else if (!sessionId) 
        route.push('/login')
        return false
    


module.exports = User

我知道一个解决方案是将库导入函数组件,但我真的不想继续在任何地方导入它。

这就是我导入模块的方式。

import User from '../src/modules/accountFunctions'

const dashboard = () => 
    console.log('Rance')
    User.GetData()
    return <NavBar />


export default dashboard

【问题讨论】:

此外,随着节点版本的推进,这种 CommonJS ESM 兼容性会定期获得更多选项。你运行的是什么版本的nodejs?这是 v12 中的 discussion of options,显然在 v14 中添加了更多内容。 这不起作用,但很奇怪,因为该功能确实有效,我可以打印它和所有内容。它只是在不应该的时候打印错误。 什么版本的nodejs? 看来您在 nodejs 中没有正确使用该库。看来您必须调用cookieCutter(document) 才能获得一个对象,然后该对象上有.set().get() 方法。您传递的 document 对象需要有一个带有 getter 和 setter 的 .cookie 属性,其工作方式类似于浏览器中的 document.cookie。这在 nodejs 中似乎不是很有用,因为您必须编写一堆包装器代码才能使其工作。 仅供参考,这段代码的全部内容在这里:github.com/substack/cookie-cutter/blob/master/index.js。它的内容并不多,而且它已经 5 年没有更新了。你可以从中看出你应该如何使用它。 【参考方案1】:

您需要将 cookie 获取逻辑移动到自定义挂钩内的 useEffect,因此它仅在客户端运行。当 Next.js 在服务器上预渲染页面时,调用 cookieCutter.get 将不起作用。

const useUserData = async () => 
    const route = useRouter()
    const userData = useSelector((state) => state.user)
    const dispatch = useDispatch()

    useEffect(() => 
        const getAuthenticatedUser = async () =>    
            const sessionId = cookieCutter.get('session')

            if (sessionId && userData.username === '') 
                const userExist = await Auth.loadUserInformation()
                if (userExist.result === false) 
                    route.push('/login')
                
                dispatch(accountActions.updateAccountInformation(userExist.data))
             else if (!sessionId) 
                route.push('/login')
            
        
        getAuthenticatedUser()
    , [])

【讨论】:

以上是关于导入模块,库函数出错的主要内容,如果未能解决你的问题,请参考以下文章

python3导入当前目录模块里的函数出错

解析模块说明符时出错:从 API 进行动态导入时做出反应

导入 scikit-learn 模块时出错

安装BeautifulSoup库成功但是为啥导入出错

导入scikit-learn模块时出错

python 导入模块问题