2013-09-25 58 views
1

我正在使用Node/Express和Jade構建應用程序。JadeJS和重寫呈現視圖中的預寫入表單值

我有一個POST路由,用於清理和驗證表單輸入,然後將其保存到MongoDB。 如果此表單輸入未驗證,路由將拋出錯誤,並且錯誤處理程序將重新呈現此相同頁面...

而這裏出現問題。在這個重新渲染,並希望表單值預先編寫,並準備由用戶糾正...我不想要一個乾淨的表單,用戶必須重寫所有內容。

我試圖提交req.body(消毒)數據到重新呈現的頁面,它的工作原理。 但是如果試圖在我的Jade視圖中使用這些數據,當這個請求數據是而不是定義時,節點將會輸出並出錯......就像你第一次進入這個頁面並且沒有輸入任何錯誤輸入尚未。

我該如何解決這個問題?

回答

1

編輯 -沒有代碼示例我不確定我的示例是否比您需要的更多或更少。

如果您立即在表單的POST請求處理程序中呈現表單模板,那麼您可能不需要涉及req.session。只需保存適當的當地人並渲染你的模板。

如果您必須重定向或以其他方式需要跨多個請求提供值,則可以將它們保存在req.session中,如下所示。

無論哪種方式確保你的Jade模板處理所有情況;在我的示例中,我測試if(locals.savedValues)以決定是否將默認值或保存的值寫入表單。

最後,如果錯誤不是玉關係,請粘貼該錯誤。


使用req.session保存值。在呈現表單之前,設置一個locals變量來表示已保存的值或null。

app.get('/form', function(req, res){ 
    res.locals.savedValues = req.session.savedValues || null; 
    res.locals.savedErr = req.session.savedErr || null; 
    res.render('form'); 
}); 

app.post('/form', function(req, res){ 
    var values = { 
    name: req.body.name, 
    email: req.body.email, 
    }; 
    validateForm(values, function(err, processed){ 
    if(err){ 
     req.session.savedValues = processed; 
     req.session.savedErr = err; 
     // req.session.savedValues = values, if you dont want to propose changes 
     res.redirect('back'); 
    } else { 
     delete req.session.savedValues; 
     delete req.session.savedErr; 
     res.redirect('/success'); 
    }; 
    }); 
}); 

在你的玉模板,處理這兩種情況:

if(locals.savedErr) 
    span.error=locals.savedErr 
form(action='form', method='post') 
    if(locals.savedValues) 
    input#name(type='text')=locals.savedValues.name 
    input#email(type='text')=locals.savedValues.email 
    else 
    input#name(type='text') 
    input#email(type='text') 
+0

謝謝!我不習慣與會話一起工作。我是否正確地認爲:'app.use(express.cookieParser());'和這個'app.use(express.session();'是我需要能夠將值存儲在req.session中的所有東西? –

+0

一個簡短的問題,你可以將reales.value中的值保存到res.locals中,因爲req.session在那裏不可用,所以你可以這樣做,因爲這裏的值不可用? 將變量傳遞給?鑑於這樣這是錯的 'res.render( '形式',{ savedValues:req.session.savedValues ||空, savedErr:req.session.savedErr ||空, ... }? );' –

+0

如果你確實不需要會話,你當然可以重新呈現表單中的表單 – Plato