2015-07-08 12 views
5

Ho un codice semplice qui.perché il confronto Javascript non funziona con gli oggetti?

L'intenzione è quella di verificare l'utente con l'utente che ha scritto il post e consentire all'utente verificato di modificare il post.

exports.edit = function(req, res){ 
    Post.findById(req.params.post_id, function(err, post){ 
     if(err){ 
      return res.json({ 
       type:false, 
       message:"error!" 
      }); 
     }else if(!post){ 
      return res.json({ 
       type:false, 
       message:"no post with the id" 
      }) 
     }else{ 
      console.log(req.user._id, typeof req.user._id); 
      console.log(post.author.user_id, typeof post.author.user_id); 
      if(req.user._id === post.author.user_id){ // doesn't work!! 
       return res.json({ 
        type:false, 
        message:"notAuthorized" 
       }); 
      }else{ 
       return res.json({ 
        type:true, 
        message:"it works", 
        data:post 
       }); 
      } 
     } 
    }); 
} 

La console dice:

557c6922925a81930d2ce 'object' 
557c6922925a81930d2ce 'object' 

che significa che sono uguali in valore e anche uguale nei tipi.

Ho provato anche con ==, ma anche questo non funziona.

Sospetto che sia necessario fare qualcosa per confrontare gli oggetti, ma non so esattamente cosa dovrei fare.

+0

molto strano che questi vengono registrati come stringhe ancora dicono che sono oggetti. Se si trattasse di un oggetto 'String', allora vedresti un sacco di altre cose oltre al solo valore di stringa. – Adam

+0

Che tipo di oggetto in JavaScript registra un valore stringa ma non è una stringa primitiva? – Adam

risposta

6

Javascript, quando ha chiesto di confrontare due oggetti, confrontare l'indirizzo dell'oggetto, non l'oggetto stesso. Quindi sì, i tuoi oggetti hanno lo stesso valore, ma non si trovano nello stesso posto in memoria.

Puoi provare a estrarre l'id nella nuova variabile e confrontarla (o convertirli in stringa e confrontare le stringhe).

Esempi:

var id_edit = req.user._id, 
    id_post = post.author.user_id; 
if (id_edit === id_post) { 
    //... 
} 

O

if(req.user._id.toString() === post.author.user_id.toString()) { 
    ... 
} 
3

È necessario confrontare le rappresentazioni di stringa degli oggetti identificativi mongodb.

Prova questo:

req.user._id.toString() === post.author.user_id.toString() 
2

seguito lavorerà per voi:

req.user._id.toString() === post.author.user_id.toString() 
+0

Oh, anche Friedi ha le stesse opinioni. – Vikas

2

Questa domanda è già stato risposto here, ma ai fini di essere esplicito. ..

Se stai usando underscore, si può solo fare _.isEqual(obj1, obj2);

Tuttavia, non v'è alcun buon modo generale di fare questo. Leggi le altre domande simili su SO per i dettagli.

0

è possibile confrontare solo le proprietà facendo oggetti JSON fuori gli oggetti da confrontare: JSON.stringify(obj1) === JSON.stringify(obj2)

anche se non è andare a controllare metodi e tipi di proprietà, è più semplice e probabilmente confronto più veloce per implementare

4

Le persone hanno menzionato toString(), ma mongo ha anche i propri metodi per ObjectIds.È possibile utilizzare:

post.author.user_id.equals(req.user._id)

Problemi correlati