跨服务POST请求后无法返回渲染页面的技术求助
问题:POST请求后页面无法渲染的解决方案
嘿,我懂你现在的困扰——数据能正常传过去,但页面就是不渲染对吧?核心问题其实出在请求的对象搞错了,咱们一步步理清楚:
问题根源
你的服务1是用request-promise发起的后端-to-后端POST请求,服务2里的res.render('welcome')其实是把渲染好的HTML返回给了服务1的请求,而不是用户的浏览器!所以用户端自然看不到任何页面变化。
你的现有代码
服务1的POST请求代码
var request = require('request'); var rp = require('request-promise'); exports = module.exports = function (req, res) { var options = { method: 'POST', uri: 'http://localhost:3001/referral-service', body: { some: 'payload' }, json: true // Automatically stringifies the body to JSON }; rp(options) .then(function (parsedBody) { console.log(parsedBody); }) .catch(function (err) { console.log('err') }); };
服务2的API代码
module.exports = function(router) { const bodyParser = require('body-parser'); router.get('/', function(req, res, next) { res.render('welcome'); }); router.post('/referral-service', bodyParser.json(), function(req, res, next) { res.render('welcome'); }); };
针对不同需求的解决方案
需求1:用户触发操作后直接跳转到服务2的渲染页面
这种场景下,服务1不需要自己处理服务2的渲染结果,而是告诉用户的浏览器直接去请求服务2的页面(如果需要传递数据,可以用URL参数或者会话存储):
修改服务1的代码:
var request = require('request'); var rp = require('request-promise'); exports = module.exports = function (req, res) { var options = { method: 'POST', uri: 'http://localhost:3001/referral-service', body: { some: 'payload' }, json: true }; rp(options) .then(function (parsedBody) { // 重定向到服务2的首页,让浏览器直接加载渲染后的页面 res.redirect('http://localhost:3001/'); }) .catch(function (err) { console.log('err'); // 出错时返回错误提示给用户 res.status(500).send('操作失败,请稍后重试'); }); };
需求2:服务2渲染页面后,由服务1把HTML返回给用户
如果需要服务1作为中间层,把服务2的渲染结果转发给用户,需要让服务2先把HTML内容返回给服务1,再由服务1传给浏览器:
- 修改服务2的POST接口:
router.post('/referral-service', bodyParser.json(), function(req, res, next) { // 用render的回调函数获取渲染后的HTML字符串 res.render('welcome', { receivedData: req.body }, function(err, html) { if (err) return next(err); // 把HTML返回给服务1 res.send(html); }); });
- 修改服务1的代码,接收HTML并返回给前端:
var request = require('request'); var rp = require('request-promise'); exports = module.exports = function (req, res) { var options = { method: 'POST', uri: 'http://localhost:3001/referral-service', body: { some: 'payload' }, json: true }; rp(options) .then(function (renderedHtml) { // 把服务2渲染好的HTML直接发给用户浏览器 res.send(renderedHtml); }) .catch(function (err) { console.log('err'); res.status(500).send('请求出错'); }); };
额外注意点
- 确认服务2的
welcome模板文件路径正确,模板本身没有语法错误 - 如果需要把服务1传递的数据展示在服务2的页面上,记得在
res.render时把req.body的数据传给模板(比如上面代码里的receivedData)
内容的提问来源于stack exchange,提问作者fatspanner
相关产品推荐
相关产品推荐

