【问题标题】:Impossible error... concurrency issue? NextJs / Node HTTP Server不可能的错误...并发问题? NextJs / 节点 HTTP 服务器
【发布时间】:2020-04-17 05:28:45
【问题描述】:

我遇到了一个不应该发生的问题:

参见initialUserState 的设置取决于三元运算的结果。但是,这个操作在这里应该返回 false(因为 context 对象中没有 user 属性。(您可以在下面的调试器中看到它)

这里可能发生了什么?

数据来自 NextJS 应用程序中的先前请求(我使用的是 Firefox 和 Firefox Private 模式)。这仅在请求彼此快速相邻时才会发生。所以我认为这是一个并发问题,但不明白为什么javascript会在这种情况下失败。如果我在这里再次声明,initialUserState 如何保持该值。

import {userInitialState} from "./UserContext";
import {listInitialState} from "./ListContext";
import {createContext, useState} from "react";

/**
 * Sets the initial application context
 */
export default class ApplicationContext {

    userContext;
    listContext;

    /**
     * Will set the initial application state.
     * @param context
     */
    constructor(context) {
        let initialUserState = context.hasOwnProperty('user') ? context.user : userInitialState;
        const userContextUpdater = () => {
            let [state, setState] = useState({...initialUserState})
            return [state, setState];
        }
        this.userContext = createContext(userContextUpdater);

        let initialListState = context.hasOwnProperty('list') ? context.list : listInitialState;
        const listContextUpdater = () => {
            let [state, setState] = useState({...initialListState})
            return [state, setState];
        }
        this.listContext = createContext(listContextUpdater);
    }

    /**
     * Returns the UserContext
     * @returns {*}
     */
    getUserContext = () => {
        return this.userContext;
    }

    /**
     * Returns the List context
     * @returns {*}
     */
    getListContext = () => {
        return this.listContext;
    }
}

_app.js

import ApplicationContext from "../lib/Context/ApplicationContext";
import {useContext} from "react";

export default function RankerApp({Component, pageProps}) {
    const applicationContext = new ApplicationContext(pageProps);
    const ListContext = applicationContext.getListContext();
    const UserContext = applicationContext.getUserContext();

    const [listState, setListState] = useContext(ListContext)();
    const [userState, setUserState] = useContext(UserContext)();

    return (
        <ListContext.Provider value={[listState, setListState]}>
            <UserContext.Provider value={[userState, setUserState]}>
                <Component {...pageProps} applicationContext={applicationContext}/>
            </UserContext.Provider>
        </ListContext.Provider>
    );
}

UserContext.js

export const userInitialState = {
    currentUserId: undefined,
    users: {},
}

这让我发疯了,看起来这是某种并发问题,我无法解释,因为如果请求及时间隔,则不会发生这种情况

【问题讨论】:

    标签: javascript node.js concurrency next.js


    【解决方案1】:

    我好像被对象引用咬了。

    这是以前的:

    这是解决办法

    所以在这里我为returnContext['user'] 分配了对userInitialState 的引用

    然后在下面修改。

    由于某种原因,我的 NextJS 应用程序正在持久化一些东西(我不知道这是否是因为它是一个已编译的服务器,但如果我放置一个计数器,Pages 内的变量仍然存在),这个值也保持不变。

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2019-08-28
      • 2016-06-12
      • 2015-03-17
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多