Cố gắng tái tạo (và sửa chữa) các tùy chọn không xác định được trong dữ liệu khách hàng: 90


7

Chúng tôi thỉnh thoảng phải đối mặt với vấn đề sau khi bật / thanh toán / giỏ hàng /. Như một hiệu ứng, nhấp vào "Tiếp tục thanh toán" không hoạt động.

Chúng tôi tin rằng quá trình này không hoạt động do lỗi javascript sau đây được ghi lại:

nhập mô tả hình ảnh ở đây

Vấn đề đã được tái tạo trên hai máy, ngay cả sau khi tải lại toàn bộ trang. Nhưng bây giờ không còn nữa.

Tôi đã xem mã ở dòng 90

    getFromServer: function (sectionNames, forceNewSectionTimestamp) {
        var parameters;

        sectionNames = sectionConfig.filterClientSideSections(sectionNames);
        parameters = _.isArray(sectionNames) ? {
            sections: sectionNames.join(',')
        } : [];
        parameters['force_new_section_timestamp'] = forceNewSectionTimestamp;

/** Line 90 **/ return $.getJSON(options.sectionLoadUrl, parameters).fail(function (jqXHR) {
            throw new Error(jqXHR);
        });
    }
};

Vì vậy, rõ ràng các tùy chọn không được tải bằng cách nào đó - nhưng chúng nằm trong hàm tạo, vậy làm thế nào điều này có thể?

Hạnh phúc vì sự giúp đỡ nào.

BIÊN TẬP

Tôi đã tìm ra vấn đề ở một mô-đun nơi chúng ta tương tác với dữ liệu khách hàng.

Chúng tôi có mã sau đây:

define([
    'jquery',
    'Magento_Customer/js/model/authentication-popup',
    'Magento_Customer/js/customer-data'
], function ($, authenticationPopup, customerData) {

    customerData.reload(['minvalue'],true).done(function(){

Trong một số trường hợp, mã này dường như được gọi trước hàm tạo

vendor/magento/module-customer/view/frontend/web/js/customer-data.js:366


    'Magento_Customer/js/customer-data': function (settings) {
        options = settings;
        invalidateCacheBySessionTimeOut(settings);
        invalidateCacheByCloseCookieSession();
        customerData.init();
    }

Câu hỏi: Làm thế nào tôi có thể buộc mã của mình được chạy, sau khi hàm tạo được chạy?


1
Có lẽ đó là một vấn đề thời gian?
Daniel


@alex Bạn có thể đăng toàn bộ ngăn xếp lỗi theo dõi JS không?
che khuất

@obscure Tôi không thể vì tôi không thể sinh sản
Alex

@TuyenNguyen Gần đây chúng tôi đã thực hiện Cập nhật Magento từ 2.2.6 đến 2.2.8 ... Vì vậy, nếu tôi hiểu bạn liên kết chính xác, điều này xảy ra với những người đã xem cửa hàng 2.2.6 và không có cửa hàng 2.2.8? Nhận xét đề nghị xóa bộ nhớ cache của trình duyệt và bộ nhớ cục bộ --- nhưng điều đó sẽ cần mã tùy chỉnh, phải không? Magento không quan tâm đến điều đó?
Alex

Câu trả lời:


2

Thông thường các customer-data.jslỗi được gây ra bởi các vấn đề lưu trữ cục bộ của trình duyệt sau khi vô hiệu hóa các mô-đun thêm các phần vào đối tượng dữ liệu khách hàng (từ kinh nghiệm của tôi).

Vì vậy, 1 khách hàng (pc) có thể thấy lỗi nhưng những người khác sẽ không.

Giải pháp trong trường hợp của tôi (mặc dù khác một chút so với của bạn) là xóa bộ nhớ cục bộ của trình duyệt có thể được thực hiện thông qua các công cụ gỡ lỗi trình duyệt trên storagetab trong Firefox hoặc applicationtab trong Chrome. Và xóa bộ nhớ cache của Magento.

Nếu điều đó không hoạt động, tôi sẽ kiểm tra mọi mô-đun được cài đặt gần đây có sửa đổi customer-datađối tượng hoặc chức năng Magento được kết nối với khách hàng (tức là thử tắt các mô-đun tùy chỉnh 1).


Cảm ơn. Vấn đề vẫn là tôi không thể tái tạo nó. vì vậy, vô hiệu hóa các mô-đun 1, 1, v.v. không giúp ích gì cả, vì tôi không có cách nào để xác minh nếu nó hoạt động sau khi vô hiệu hóa mô-đun
Alex

1
Không thể tái tạo vấn đề, không có đề xuất / giải pháp nào được đưa ra có thể thực sự được kiểm tra ... vì vậy đây có thể là sự cố tạm thời do một số yếu tố bên ngoài (mà bạn không thể giải thích) hoặc kết hợp cụ thể của khách hàng / người dùng hành động. Tôi sẽ đề nghị trước tiên có thể tái tạo vấn đề trước khi cố gắng khắc phục nó.
Lez

1
Bạn có thể thử sao chép nó bằng cách xóa tất cả phiên và bộ nhớ cục bộ, hạ cấp xuống 2.2.6, đi tới / kiểm tra / giỏ hàng và nhấp vào "Tiếp tục thanh toán" sau đó nâng cấp lại và xem bạn có gặp lại lỗi không. Đó là một số nỗ lực khá nhiều nhưng có thể giúp bạn xác minh đó là một vấn đề với bộ nhớ cục bộ.
Daniel

@Lez: Câu hỏi là hỏi về cách tôi có thể sao chép này :-)
Alex

1
@Alex hehe Tôi hoàn toàn bỏ lỡ điều đó trong tiêu đề ... mặc dù tôi sẽ không bao giờ cố gắng tái tạo điều này một cách cá nhân (vì tôi có nhiều vấn đề đau đầu từ việc gỡ lỗi như thế này khi tôi bắt đầu với M2), nhưng nếu bạn muốn "tra tấn" chính mình, Tôi sẽ đi với câu trả lời của Daniel. Nhưng nếu tôi đoán, vấn đề có lẽ là do sự khác biệt của các bộ phận khách hàng được tải bởi các mô-đun mới hoặc được điều chỉnh sau khi nâng cấp lên M2.2.8
Lez

2

Như đã đề cập trong bình luận vấn đề này, có khả năng lỗi này là do sự cố lưu trữ cục bộ sau khi bạn nâng cấp từ 2.2.6 lên 2.2.8.

Để tái tạo lỗi của bạn, bạn có thể thử các bước sau:

  1. Trong trình duyệt của bạn xóa tất cả dữ liệu cục bộ của trang web của bạn
  2. Hạ cấp Magento trở lại 2.2.6
  3. Ghé thăm giỏ hàng và tiến hành thanh toán
  4. Nâng cấp lại Magento của bạn
  5. Đi đến giỏ hàng một lần nữa và thử tiến hành thanh toán

Tôi nghĩ rằng đây là một nỗ lực khá nhiều nhưng có thể giúp bạn tái tạo và xác minh xem lỗi này có phải do bộ nhớ cục bộ hay không.


Tôi đã thử nó nhưng quên bước 1 ... Tôi sẽ thử lại lần nữa
Alex

1

Chúng tôi đã theo dõi điều này xuống một thành phần tùy chỉnh ghi đè

nhà cung cấp / magento / kiểm tra mô-đun / xem / frontend / web / js / tiến hành kiểm tra.js

return function (config, element) {
    ### basically our change
    customerData.reload(['minvalue'], true);
    var minOrderValue = customerData.get('minvalue');
    ## end of our changee
    $(element).click(function (event) {
        var cart = customerData.get('cart'),
            customer = customerData.get('customer');

        ## do something with minOrderValue here

        event.preventDefault();

        if (!customer().firstname && cart().isGuestCheckoutAllowed === false) {
            authenticationPopup.showModal();

            return false;
        }
        $(element).attr('disabled', true);
        location.href = config.checkoutUrl;
    });

};

Điều này dường như gây ra điều kiện chủng tộc rất hiếm nhưng xấu xí. customerData.reload có thể được gọi, ngay cả hàm tạo của customerData cũng không chạy.

Bây giờ chúng tôi chỉ đơn giản là di chuyển

 customerData.reload(['minvalue'], true);

vào trình xử lý nhấp chuột, vì vậy nó chắc chắn sẽ được gọi một lát sau.

Nhưng tôi cảm thấy điều này rất xấu xí. Hàm tạo được gọi bởi Magento main.jsvà tôi đoán nếu ai đó nhấp đủ nhanh, nó vẫn không hoạt động chính xác.

Nhưng vì cốt lõi đang làm điều đó giống nhau, điều này sẽ hoạt động; và ít nhất người dùng có thể nhấp lại (điều mà trước đây họ không thể thực hiện được, vì việc khởi tạo thất bại)

Chúng tôi có một trình ghi lỗi javascript chạy trên hệ thống và sẽ biết sau một vài ngày, nếu lỗi xuất hiện trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.