【问题标题】: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 年没有更新了。你可以从中看出你应该如何使用它。

标签: node.js reactjs next.js typeerror


【解决方案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()
    }, [])
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多