2014-04-29 10 views
5

Sono alla fine della mia corda su questo. Sto ottenendo questo errore in posti apparentemente casuali nella mia app. Raven li segnala da un paio di dozzine di luoghi, ma posso solo replicare un paio a livello locale. Mi sembra che il problema abbia qualcosa a che fare con l'analisi della risposta JSON, ma le risposte sono valide.

Nel mio servizio angolare ...

... 
getThread: function(id, success, error) { 
    $http.get('/message/'+id).success(function(data){ 
     success(data); 
    }).error(error); 
} 
... 

Nel mio controller espresso ...

... 
res.json(mssgs); 
... 

Ecco una risposta del campione ...

[ 
    { 
    "id": 79, 
    "body": "test", 
    "senderArchived": false, 
    "recipientArchived": false, 
    "createdAt": "2014-04-17T01:44:46.762Z", 
    "updatedAt": "2014-04-17T01:44:46.762Z", 
    "RootMessageId": 69, 
    "SenderId": 164050, 
    "RecipientId": 154040, 
    "sender": { 
     "username": "boca", 
     "id": 164050, 
     "primaryMedium": null 
    }, 
    "recipient": { 
     "username": "quimby", 
     "id": 154040, 
     "primaryMedium": { 
     "id": "186", 
     "type": "image", 
     "nativeURL": "https://domain/imageurl.jpg", 
     "mediumURL": "https://domain/imageurl.jpg", 
     "smallURL": "https://domain/imageurl.jpg", 
     "createdAt": "2014-04-21T15:52:10.927Z", 
     "updatedAt": "2014-04-21T15:52:10.947Z", 
     "CommentId": null, 
     "EventId": null, 
     "UserId": 154040, 
     "PostId": null, 
     "MessageId": null, 
     "MediaFolderId": null 
     } 
    }, 
    "messageMedia": [] 
    } 
] 

Sia Chrome e In Safari ciò genera un errore "Uncaught SyntaxError: Token inaspettato)"

Ecco le intestazioni di richiesta da Chrome ...

Remote Address:127.0.0.1:3001 
Request URL:https://localhost:3001/message/69 
Request Method:GET 
Status Code:200 OK 

Request Headers 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,ja;q=0.6 
Connection:keep-alive 
Cookie:streamLoc=%7B%22distance%22%3A-1%2C%22locName%22%3A%22%22%7D; usePostLocation=yes; connect.sid=s%3AhX37rupUct2jut4yApN1GIH9.n5nPURTMXl5OKd46rMqeRc4bg1Q%2F%2Bky0El2r%2BcBvC8c; user=%7B%22id%22%3A154040%2C%22role%22%3A%7B%22bitMask%22%3A32%2C%22title%22%3A%22admin%22%7D%2C%22username%22%3A%22quimby%22%2C%22emailVerified%22%3Atrue%2C%22verified%22%3Atrue%7D 
Host:localhost:3001 
Referer:https://localhost:3001/messages 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36 

Response Headers 
Connection:keep-alive 
Content-Length:1115 
Content-Type:application/json; charset=utf-8 
Date:Tue, 29 Apr 2014 02:41:47 GMT 
ETag:"485872145" 
X-Powered-By:Express 

Ogni altra domanda simile ha indicato JSONP o problemi di sintassi reali, ma non sto usando JSONP e non ci sono problemi di sintassi del codice.

+0

Un problema di minimizzazione? Prova a correre con l'uso rigoroso? – paulmelnikow

+0

No. Modalità rigorosa abilitata già. Nessuna minificazione –

+2

fa .error() si aspetta una funzione? –

risposta

1

Dato che non conosco la tua situazione esatta, non posso fornire la risposta esatta. Tuttavia, questo è il mio tentativo.

Vedo che il servizio non restituisce nulla, ma l'elaborazione delle funzioni di errore e di successo al suo interno.

getThread: function(id, success, error) { 
    $http.get('/message/'+id).success(function(data){ 
     success(data); 
    }).error(error); 
} 
  1. È il vostro errore (errore) è corretto? Presumo che tu stia passando la funzione di errore come parametro, ma vedo incoerenza tra success(data) e error

  2. Questa è una raccomandazione. Penso che dovresti cambiare il tuo servizio solo restituire la promessa e non elaborare nulla. Quindi dovrebbe assomigliare a questo.

    getThread: function(id) { 
        return $http.get('/message/'+id); 
    } 
    

    Poi il controller gestisce successo ed errori, in modo da poter vedere tutti i messaggi di successo e messaggi di errore. Quindi, il controllore avrà un codice come il seguente

    MyService.getThread(id).then( 
        function(data) {....}, 
        function(error) {....} 
    } 
    

Avere logica di elaborazione dei dati nel controller vi darà molta più difficoltà a debug.

Si consiglia di elaborare i dati http nel controller, non in un servizio.

1
  • l'errore sembra essere legata a una qualche funzione di parsing di JSON
  • L'intestazione di risposta di esempio dire "application/json; charset = utf-8"

Detto questo, sembra che non è necessario per utilizzare qualsiasi funzione di analisi, manca qualcosa.

Se non è possibile riprodurlo sempre, consentirei di registrare le chiamate di rete, in modo da poter visualizzare esattamente quale risposta/i dare problemi.

0

State passsing un null come id in

getThread: function(id, success, error) { 
    $http.get('/message/'+id).success(function(data){ 
     success(data); 
    }).error(error); 
} 

che si darebbe un errore di sintassi quando si risolve $ http.get ('/ messaggio /' +)

Inserire un test per null prima la chiamata $ http e attendere che venga colpita.

+0

in realtà null viene eseguito il cast di string..String ('/ message /' + null) = 'message/null' – rahpuser

+0

Sì, hai ragione. Una stringa vuota farebbe il lavoro però! – pjsvis

Problemi correlati