2017-05-11 1 views
0

Ich bin neu zu Nodejs, Express und Mongodb. ich an der FindOne Funktion ObjectId von mongodbExpress mit mongodb find one

Mit dem folgenden Code stecken blieb, bekam ich die Fehlermeldung: „Fehler: Argument übergeben muss ein einzelner String von 12 Bytes oder eine Zeichenkette von 24 Hex-Zeichen“ Im mit neuester Version von allem (weil im neu für sie)

enter image description here

meinen Code im Blick:

<% for(var i = 0 ; i < posts.length; i++) { %> 
        <% post = posts[i] %> 
        <article class="post"> 
        <div class="post-preview col-xs-10 no-gutter"> 
         <h2> 
         <a href="/posts/<%=i%>"> 
          <%= post.title %> 
         </a> 
         </h2> 
         <p><%= post.description %></p> 
         <p class="meta"> 
         <a href="author.html"><%= post.author.name %></a> in 
         <a href="category.html"><%= post.category.name %></a> <i class="link-spacer"></i> <i class="fa fa-bookmark"></i> <%= post.created_at %> 
         </p> 
        </div> 
        <div class=" col-xs-2 no-gutter"> 
         <img src="<%= post.author.image %>" class="user-icon" alt="user-image"> 
        </div> 
        </article> 
       <% } %> 

Bitte sagen sie mir, was mit meinem Code falsch ist. p/s: Die req.params.id ist gültig und kann protokolliert werden.

+0

machen können Sie 'id' drucken? –

+0

@ Jérôme ja, ich kann, wie ich es gesagt habe logbar. Route:/Posts/1 -> ID ist als 1 protokolliert –

+0

Das Problem ist, dass 1 ist keine gültige ObjectId – JohnnyHK

Antwort

2

Standard Mongo IDs erhöhen nicht aus 1. Sie wie "_id" : ObjectId("5908f94c06515dfa8522459c") in der Datenbank suchen. Ihr Problem ist, dass Ihr href nach Index navigiert, nicht nach der ID selbst. Sie müssen sich ändern:

<a href="/posts/<%=i%>"> 
    <%= post.title %> 
</a> 

zu:

<a href="/posts/<%=post._id%>"> 
    <%= post.title %> 
</a> 

dies Ihr Link /posts/5908f94c06515dfa8522459c statt /posts/1

+0

Danke. Aber wenn ich meine URL wie/posts/1 haben möchte, wie kann ich das machen? –

+0

Sie müssen Ihren Dokumenten ein neues Feld hinzufügen: 'myOtherId', und dann nach diesem Feld abfragen.Sie müssen eine Inkrementierungsfunktion haben, die ausgeführt wird, bevor Sie neue Dokumente einfügen. Für die Persistenz müssen Sie eine andere Sammlung erstellen, um den aktuellen Wert Ihres Inkrements beizubehalten. Ich würde mich nach "mongo autoincrement" umsehen. Ich bin mir sicher, dass andere das schon mal gemacht haben. – cdbajorin

+0

hmm, das ist neu für mich, ich bin von rails und habe keine Ahnung von all dem, ich werde mehr recherchieren. Vielen Dank ! –

0

Ich vermute es ist, weil die ID eine Zeichenfolge von nicht 12 Bytes (noch 24 Hex-Zeichen) ist. Wenn die URL auf Ihrem Express-Webserver eingeht, handelt es sich um eine Zeichenfolge. Wenn express einem Teil davon entspricht und es speichert, gibt es keine Regel, dass :id nicht myCoolId sein könnte, was keine Zahl ist.

Also alles in req.params ist eine Zeichenfolge. Ich würde einige Überprüfung hinzufügen, um sicherzustellen, dass es eine Nummer ist, werfen Sie es und dann geben Sie es an ObjectId.

EDIT: Wenn Sie mit ihm als Strings arbeiten wollen, dann versuchen Sie einige der folgenden Optionen:

const ObjectID = require('mongodb').ObjectID; 

// When making a brand new record, just use a new object id. 
let record = new ObjectID(); 
console.log(record); 

// When giving the ID to the client as a string, make it a hex string. 
let hexString = record.toHexString(); 
console.log(hexString); 

// You can validate that it's a valid object id in your route when they post it back. 
let valid = ObjectID.isValid(hexString); 
console.log(valid); 

// Then you can turn it back into an object id. 
let fromHex = ObjectID.createFromHexString(hexString); 
console.log(fromHex); 
+0

Also, wenn ich den Link zu einer einzelnen Seite posten, was soll ich in die URL eingeben? –

+0

'ObjectId' hat eine Reihe von Methoden, die Ihnen helfen können. [toHexString] (http://mongodb.github.io/node-mongodb-native/2.2/api/ObjectID.html#toHexString) und [createFromHexString] (http://mongodb.github.io/node-mongodb-native /2.2/api/ObjectID.html#.createFromHexString) ermöglicht es Ihnen, sie in eine Zeichenfolge, die Sie an den Client senden können, um eine Verbindung herzustellen, umzuwandeln. Wenn eine Zeichenfolge eingeht, können Sie [ObjectId.isValid] (http://mongodb.github.io/node-mongodb-native/2.2/api/ObjectID.html#.isValid) verwenden, um vor der Verwendung zu überprüfen, ob es gut ist. –

+0

@DuongBach Um eine neue Objekt-ID zu erstellen, müssen Sie nur "new ObjectID()" ohne Parameter eingeben. Es wird ein neues machen. Dann können Sie damit beginnen, diese Methoden aufzurufen. –