2017-05-11 6 views
0

Im new to nodejs、express and mongodb。 は、私は以下のコードでのMongoDBエクスプレスmongodbで1つを見つけなさい

ののObjectIdを使用してfindOne機能で捕まってしまった、私はエラーを得た:「エラー:渡された引数は、12バイトの単一の文字列または24進文字列でなければなりません」イム ビューに

enter image description here

(イム新しいので、それらに)私のコードを、すべての最新のバージョンを使用して:

<% 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> 
       <% } %> 

私のコードで間違っているものを私に教えてください。 p/s:req.params.idが有効でログ可能です。

+0

/posts/1のあなたのリンクを行います:

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

に:あなたは変更する必要がありますか? –

+0

@Jérômeはい、できます。 route:/ posts/1 - > idが1として記録されています –

+0

1は有効なObjectIdではありません – JohnnyHK

答えて

2

デフォルトのmongo IDは1から増加しません。彼らはデータベースに"_id" : ObjectId("5908f94c06515dfa8522459c")ようになります。あなたの問題は、あなたのhrefがidでナビゲートしているのではなく、idそのものです。あなたは `id`を印刷することができます

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

これは/posts/5908f94c06515dfa8522459c代わり

+0

ありがとうございました。しかし、もし私が/ posts/1のように私のURLを持っていたいなら、どうすればいいですか? –

+0

ドキュメントに新しいフィールドを追加する必要があります: 'myOtherId'、そしてそのフィールドでクエリします。新しい文書を挿入する前にインクリメント機能を実行する必要があります。持続性のためには、インクリメントの現在の値を保持するために別のコレクションを作成する必要があります。私は "mongo autoincrement"を見回したいと思います。私は他の人がこれまでにやったことを確信している。 – cdbajorin

+0

ええ、これは私には新しかったし、レールからのもので、これに関するすべてのことは考えていない、私はより多くの研究をするだろう。ありがとう! –

0

idは12バイト(24桁の16進数ではない)の文字列なので、私は推測しています。 URLがあなたの高速Webサーバーに届くと、それは文字列です。表現が一致してその一部を保存して保存する場合、:idは数字ではないmyCoolIdにはなり得ないというルールはありません。

したがって、req.paramsのすべてが文字列です。私はそれが数字であることを確認するいくつかのチェックを追加し、それをキャストし、ObjectIdにそれを与える。

EDIT:あなたは文字列としてそれで仕事をしたい場合は、次のいくつかを試してみてください。

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

リンクをループして1つのページを投稿すると、URLに何を入れる必要がありますか? –

+0

'ObjectId'には、あなたを助けるいくつかのメソッドがあります。 [toHexString](http://mongodb.github.io/node-mongodb-native/2.2/api/ObjectID.html#toHexString)および[createFromHexString](http://mongodb.github.io/node-mongodb-native /2.2/api/ObjectID.html#.createFromHexString)を使用すると、リンクするクライアントに送ることができる文字列の内外にそれを変換することができます。文字列が入力されたら、[ObjectId.isValid](http://mongodb.github.io/node-mongodb-native/2.2/api/ObjectID.html#.isValid)を使用して、使用する前にそれが良いかどうかを確認できます。 –

+0

@DuongBach新しいオブジェクトidを作るには、paramsを持たない 'new ObjectID()'が必要です。それは新しいものを作ります。その後、それらのメソッドを呼び出すことができます。 –

関連する問題