我最近開始重構舊的回調 - 地獄路由以使用承諾。(注:重構不完成這麼一些下面的代碼是醜陋的)Express.js:res.render()在包裝在承諾鏈中時不發送數據
這樣做打破了我的res.render()
功能。
- 我正在使用EJS作爲我的渲染引擎。
- 我的許多承諾鏈都是基於MongoDB/Mongoose查詢構建的。
基本的應用程序結構是一個複雜的調查/測驗,將用戶分爲不同的類別。它存儲他們的信息並在最後呈現一個自定義的EJS頁面。以下是最後通話的工作原理,基本上如下:
mongoose.model('Result')
.findOne({quizId: req.query.id})
.then(getPageData)
.then(renderPage)
.catch(errorHandler)
理論上足夠簡單。
相關功能:
let getPageData = (mongooseResult) => {
let resultsPage;
let analyticsData;
if (mongooseResult.answers.section1.question1.answer != null && mongooseResult.answers.section1.question1.answer != undefined){
let resultsPage = WP.getPage(wp_pages_data, 'slug', mongooseResult.coreFit);
let analyticsData = {
quizId: mongooseResult.quizId,
coreFit: mongooseResult.coreFit,
secondFit: mongooseResult.secondFit,
degree: mongooseResult.answers.section1.question1.answer,
year: mongooseResult.answers.section1.question2.answer,
concentration: mongooseResult.answers.section1.question3.answer,
views: mongooseResult.views,
}
mongooseResult.views++;
mongooseResult.save();
return [resultsPage, analyticsData, mongooseResult];
} else {
throw new Error('S1Q1 IS UNDEFINED');
}
};
let renderPage = ([resultsPage, analyticsData, mongooseResult]) => {
if (resultsPage != null && resultsPage != undefined){
// WHY IS MY RENDER NOT WORKING???
res.render('templates/' + mongooseResult.coreFit, Object.assign({}, WP.get_WP_data(resultsPage), getPartials(mongooseResult.modules), analyticsData), (err, html) => {if (err) console.log(err); else res.send(html);});
} else {
throw new Error('GETTING PAGE DATA RETURNED UNDEFINED');
}
};
傳入的請求首先被路由到/submit
POST路線 - 它操作的一些數據,把它存儲所有的數據庫,然後做res.redirect()
到/results?id=12345
GET路線,其運行邏輯以上。
有什麼好奇的是render()
實際上是火災;回調((err, html) => {if (err) console.log(err); else res.send(html);}
)將呈現的HTML發送到如果您第二次啓用路由。
完成調查不會產生迴應;但是它會將我們所有的信息成功存儲在數據庫中,而console.logs則是客戶端請求應該重定向到的ID。使用這個生成的ID/URL打字獲取路線,字面上通過複製粘貼它,渲染就好。
交換渲染的簡單res.send('wtf')
工程 - 實際的響應發送到客戶端。 (在這種情況下字符串'wtf'...)
響應只是不發回數據。我不明白。有任何想法嗎?
UPDATE: 奇怪的是,手動擊打路線VS從我早期的POST請求重定向產生一個簡單的res.send('wtf mate')
不同的結果。
擊中GET路由和傳遞一個先前已有的ID手動將req.query:
擊中GET路線從現有POST請求中的呼叫res.redirect()
AFTER:
這可能是更快速的請求類型不匹配問題?爲什麼res.redirect('/results?id=someString')
調用會改變URL並返回一個字符串/ HTML?
爲什麼你傳遞匿名函數作爲最後一個參數? 'res.render'併發送給客戶端。我不認爲有必要做額外的'res.send'。 – num8er
你是對的 - 在這種情況下僅用於調試;我想知道是否明確添加額外的回調函數是否有幫助 - 或者在幕後吞下了祕密的「err」。 – Zfalen
由於您使用的是像'mongooseResult.save()'這樣的代碼,您確定'POST/submit'實際上是在數據庫保存/更新之前實際_waits_在重定向之前完成的嗎? – robertklep