2017-04-24 12 views
0

私はこれを間違ったやり方でやっていると推測していますが、約束などを使用しているはずですが、編集できるCMSを作成しようとしています。 mongodbドキュメントは、ブログ投稿や変数を記入したテンプレートに変換されます。変数がjavascript/node.jsで定義されるまで関数が呼び出されないようにする

My CMSは、ブログイメージ、作成者、タイトル、変更日、およびmongodbドキュメント_idをデータID属性として持つブログのリストを作成します。

ブログの1つをクリックすると、blogId経由でsocket.ioをサーバーに渡し、サーバーはブログを検索し、blogTemplateForm.pugファイルをレンダリングし、クライアントがチェックするクライアントにHTMLを送信します#editorコンテナに既にhtmlがある場合は、htmlを削除してから、編集コンテナ内に新しいhtmlを追加します。ここでユーザーはhtmlを編集できます。

この文書の参照は、mongooseモデルで処理されます。次に、コールバック関数を介して返されたブログにres.blogを設定します。後で使用するためにいくつかのフォームを生成します。 .blogオブジェクトを使用して、blogTemplateから必要なhtmlを生成し、そのhtmlをクライアントに送信します。

これは素晴らしいことですが、実際にはいけない場合でも、res.blogオブジェクトが未定義の場合があります。次の関数で..何のように? app.render()はエラーとnullを返すので、テンプレートをレンダリングする前にブログが定義されているかどうかをチェックするループを作成しました。しかし、これはhtmlがnullとして渡されるようになっても機能しません...何がありますか?

Success

あなたは私のループを見てはres.blogそれは本当に任意の未定義のres.blogオブジェクトが通じて道を作っていることも意味がありません定義されているかどうかをチェックしている場合

Failure

socket.on('edit blog', function(blogId){ 
     var res = {}; 
     Blog.findById(blogId, function(err, blog){ 
      res.blog = blog 
      res.form = Form(blog) 
     }).then(function(){ 
      res.filledForm = Bridge(res.blog, res.form).getForm() 
      delete res.form 
      if (res.blog !== (undefined & null)) { 
       app.render(blogTemplateFormPath,{blog: res.blog}, function(err, html){ 
        console.log(err); 
        console.log(html); 
        socket.emit('blog form', html) 
       }) 
      } else while (res.blog == (undefined | null)) { 
       if (res.blog !== (undefined & null)) { 
        app.render(blogTemplateFormPath,{blog: res.blog}, function(err, html){ 
         console.log(err); 
         console.log(html); 
         socket.emit('blog form', html) 
        }) 
       } 
      } 
     }) 
    }) 

私は別のオペランドを使用してみましたが、無駄に、常に時間の約5%はnullを返します

if (res.blog !== (undefined | null)) { 
    app.render(blogTemplateFormPath,{blog: res.blog}, function(err, html){ 
     console.log(err); 
     console.log(html); 
     socket.emit('blog form', html) 
    }) 
} else while (res.blog == (undefined | null)) { 
    if (res.blog !== (undefined | null)) { 
     app.render(blogTemplateFormPath,{blog: res.blog}, function(err, html){ 
      console.log(err); 
      console.log(html); 
      socket.emit('blog form', html) 
     }) 
    } 
} 

は、任意の助けてくれてありがとう。スクリーンショットは高解像度1080p x 2ですので、コードを見ることができると思います。

答えて

0

これは魚になります。あなたがfindById()にコールバックを渡している

Blog.findById(blogId, function(err, blog){ 
     res.blog = blog 
     res.form = Form(blog) 
    }).then(function(){ 
     ... 
    }); 

も約束としてそれを扱っています。私は、これがあらゆる種類の予期しない問題を引き起こすかもしれないと想像することができます。

ただ1つの方法を使用してください。これは、同様にresの必要性を除去します

Blog.findById(blogId).then(function(blog) { 
    if (! blog) { 
    ...handle "blogId not found" here... 
    return; 
    } 
    ... 
}).catch(function(err) { 
    ...handle errors here... 
}); 

:私の提案は約束を使用することです。

+0

ありがとう、完璧に動作します、ええ、それはいくつかの悪いコーディング、私の悪いです。あなたに多くの愛と幸運、私の友人<3 – lopu

0

res.blog !== (undefined | null)はあなたがしていると思われることを行っていないためです。

console.log((undefined | null)) // 0 

各ショートカットを確認する必要があります。

if (res.blog !== undefined && res.blog !== null) 

または誤ってチェックを行う

if (!res.blog) 
関連する問題