Ein Contract funktioniert im Remix, aber nicht, wenn er mit Trüffel verwendet wird

Nachfolgend der Vertrag:

uint32 firstTimeUserPoints=10;
    struct struUser{
        string orginalName;
        string originalKshoplink;
        string orginalDocumentConvention;
        bool validated;
        uint32 Points;
        uint32 totalPoints;
    }
    struct struUserTotalPoints{
        string orginalName;
        uint32 totalPoints;
    }
    mapping(string=>struUser)MappingToken;
    mapping(bytes32=>struUser)SampleMappingToken;
    struUser[] struUsers;
    struUserTotalPoints[] struArrayUserTotalPoints;
    string[] docConventionMappers;
    string[] orginalName;

//TO INSERT A RECORD WITH SOME DATA

function AddUser(string name,string link,string docConvention) public
{
        var user=MappingToken[docConvention];
        var existingTotalPoints=userTotalPoints(name);

        user.orginalName=name;
        user.originalKshoplink=link;
        user.validated=false;
        user.Points=firstTimeUserPoints;
        user.totalPoints=existingTotalPoints+firstTimeUserPoints;
        updateUserTotalPoints(name,user.totalPoints);
        user.orginalDocumentConvention=docConvention;
        docConventionMappers.push(docConvention);

        struUsers.push(struUser({orginalName:name,originalKshoplink:link, 
        validated:user.validated,Points:user.Points,totalPoints:user.totalPoints,
        orginalDocumentConvention:docConvention}));

    }

//IS THE BELOW FUNCTION FINE?, THIS IS ONE OF THE PLACE I BELIEVE IT IS GETTING MESSED.

//FOR FETCHING TOTAL POINTS OF A USER

 function userTotalPoints(string name) public returns(uint32){  

         bool isUserTotalPointsCalculated=false;

            for(uint j=0;j<struArrayUserTotalPoints.length;j++){
                if(keccak256(struArrayUserTotalPoints[j].orginalName)==keccak256(name)){                    
                    isUserTotalPointsCalculated=true;
                    return struArrayUserTotalPoints[j].totalPoints;
                }
            }
            if(!isUserTotalPointsCalculated){
                struArrayUserTotalPoints.push(struUserTotalPoints({orginalName:name,totalPoints:firstTimeUserPoints}));
                return 0;                
            }  
    }
//WHEN I CALL THE BELOW METHOD IT IS RUNNING FINE IN REMIX BUT NOT WHEN I USED WITH TRUFFLE - IN TRUFFLE THE STRING IS  RETURNED AS " " AND THE TOTAL POINTS 

    function viewuser(string docConvention)public returns(string,uint32,uint32)
{ 
        return (MappingToken[docConvention].orginalName,MappingToken[docConvention].Points,
        userTotalPoints(MappingToken[docConvention].orginalName));
    }

    function updateUserTotalPoints(string name,uint32 totalPoints) public{
        for(uint j=0;j<struArrayUserTotalPoints.length;j++){
                if(keccak256(struArrayUserTotalPoints[j].orginalName)==keccak256(name)){
                    struArrayUserTotalPoints[j].totalPoints=totalPoints;
                }
            }
    }

Ich habe es mit verschiedenen Eingängen versucht und es funktioniert gut.

Remix-Eingaben:

Geben Sie hier die Bildbeschreibung ein

Remix-Ausgänge:

Geben Sie hier die Bildbeschreibung ein

HTML:

<input id="txtViewUser" type="text" placeholder="Enter name of document convention" />
<button id="btnViewUser" onclick="App.viewUser()">View User</button>

Trüffelcode:

viewUser:function () {
    var docConvention=document.getElementById("txtViewUser");
    sampleinstance.deployed().then(function (instance) {      
        return instance.viewuser.call(docConvention).then(function (v) {
        console.log(v);
        $("#tdEmailName").text(v[0].toString());
        $("#tdPoints").text(v[1].toNumber());
        $("#tdTotalPoints").text(v[2].toNumber());
      })
    })
  },

Trüffelausgabe:

the 0 array will return the name of the user

Ich habe fünfmal verschiedene Benutzer eingefügt, also gibt es 50, wo ich versucht habe, Benutzer für eine Person anzuzeigen.

Geben Sie hier die Bildbeschreibung ein

Bitte helfen Sie mir bei der Analyse, wo ich falsch liege.

Vivek.

Antworten (1)

Es sieht so aus, als ob es wie erwartet funktioniert, aber Sie haben das BigNumber-Format nicht verstanden. Dies wird für Sie von Remix dekodiert.

BigNumber ist eine Möglichkeit, eine Zahl darzustellen, die signifikantere Ziffern hat, als JS verarbeiten kann (uint256).

Versuchen Sie, Ihre Funktionsantworten in ein lesbares Format zu konvertieren.

console.log(response.toString(10));

Wenn das die richtige Antwort ist, sollten Sie sich die in Web3 enthaltene BigNumber-Bibliothek durchlesen.

Ich hoffe es hilft.

Entschuldigen Sie die Verzögerung der Antwort. Versucht - console.log (v.toString (30)); aber immer noch kein Glück. Ausgabe ist so etwas wie " ,10,20". Trotzdem fehlt mir der String-Wert. Wie erhalte ich die String-Ausgabe?
v.toString(10);
Ich habe sogar v.toString (10) früher versucht, es ist immer noch dasselbe.