2017-04-24 49 views
0

我在猜測我正在做這個錯誤的方式,應該使用promises或其他東西,但我試圖創建一個CMS,從而您可以編輯一個mongodb文檔,然後轉換成博客文章或任何模板與變量填寫。防止函數調用,直到在javascript/node.js中定義變量爲止

我的CMS創建了一個只有博客圖像,作者,標題,修改日期以及mongodb文檔_id作爲data-id屬性的博客列表。

當您點擊其中一個博客時,它通過socket.io將blogId傳遞給服務器,服務器搜索博客,然後呈現blogTemplateForm.pug文件,並將該html發送回客戶端進行客戶端檢查如果#editor容器中已經有html,則刪除該html,然後在編輯容器內追加新的html,然後用戶可以對其進行編輯。

現在這個文檔查找是由一個貓鼬模型處理的,然後我通過回調函數將res.blog設置爲該查找返回的博客,我生成了一些表單供以後使用,否則我們會使用該res .blog對象來從blogTemplate生成我們想要的html,然後將該html發送給客戶端。

這很好,但由於某些未知的原因,res.blog對象有時是不確定的,即使它真的不應該,也就是說。在接下來的功能..喜歡什麼?所以app.render()會返回一個錯誤,併爲null返回null,所以我做了一個循環來檢查博客是否在渲染模板之前被定義。但即使這樣做不起作用,因爲html有時會被視爲null ...什麼給了?!

Failure

Success

如果你看看我的循環檢查res.blog是否定義它真的是沒有意義的,任何不確定res.blog對象是通過做它的方式。

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

我使用不同的操作數嘗試,但都無濟於事,始終返回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) 
     }) 
    } 
} 

感謝您的幫助5%。截圖是高分辨率1080p x 2,所以我認爲你將能夠看到代碼。

回答

0

這看起來腥:

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

你傳遞一個回調findById()也把它當作一個承諾。我可以想象這可能會導致各種意想不到的問題。

所以只使用一種方法。我的建議是使用這個承諾:

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

這也將消除對res的需求。

+0

謝謝,完美的作品,是的,這是一些不好的代碼,我的壞。我的朋友對你很愛和幸運<3 – lopu

0

因爲res.blog !== (undefined | null)沒有做你認爲它正在做的事情。

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

沒有捷徑,你需要檢查每一個。

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

或做虛假支票

if (!res.blog)