如何在Express路由处理器中封装HTTP请求并在EJS模板输出结果
解决方案:封装请求到Express路由并在EJS的textarea展示结果
没问题,我帮你一步步实现这个需求,分两种常见场景来处理(同步页面跳转和异步无刷新加载),你可以根据自己的需求选:
1. 先确保依赖安装到位
首先你得保证项目里已经装了express、ejs和request(如果用request的话),如果没装,执行:
npm install express ejs request
注意:
request库已经停止维护了,后面我会给你补充更推荐的替代方案(比如axios)
2. 封装请求到Express路由
把你原来的请求代码放到router.get('/roumer')处理器里,处理错误并把文本内容传给EJS模板:
方式一:同步页面跳转(点击按钮后刷新页面展示内容)
// 引入依赖 var request = require('request'); var express = require('express'); var router = express.Router(); // 你的路由处理器 router.get('/roumer', function(req, res) { // 发起请求获取远程文本文件 request.get('http://177.77.45.99:8081/gall/cesar.txt', function(error, response, body) { // 处理请求错误 if (error) { console.error('请求远程文件出错:', error); return res.render('file-view', { fileContent: '获取文件失败,请稍后重试' }); } // 检查响应状态码是否正常 if (response && response.statusCode !== 200) { return res.render('file-view', { fileContent: `请求失败,状态码: ${response.statusCode}` }); } // 把文件内容传给EJS模板 res.render('file-view', { fileContent: body }); }); }); module.exports = router;
对应的EJS模板(比如命名为file-view.ejs)
模板里放触发按钮和展示内容的textarea:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>查看文本文件</title> </head> <body> <!-- 用表单按钮触发路由请求 --> <form action="/roumer" method="GET"> <button type="submit">点击获取文本文件</button> </form> <!-- 展示文件内容的textarea --> <textarea rows="15" cols="80" readonly style="margin-top:20px;"> <%= fileContent %> </textarea> </body> </html>
3. 方式二:异步无刷新加载(更友好的用户体验)
如果不想刷新页面,就用AJAX请求路由,路由返回JSON数据,前端再把内容渲染到textarea:
修改后的路由代码
var request = require('request'); var express = require('express'); var router = express.Router(); router.get('/roumer', function(req, res) { request.get('http://177.77.45.99:8081/gall/cesar.txt', function(error, response, body) { if (error) { return res.json({ success: false, message: '获取文件失败,请稍后重试', content: '' }); } if (response && response.statusCode !== 200) { return res.json({ success: false, message: `请求失败,状态码: ${response.statusCode}`, content: '' }); } // 返回JSON格式的文件内容 res.json({ success: true, content: body }); }); }); module.exports = router;
对应的EJS模板
添加前端JS监听按钮点击,发起异步请求:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>查看文本文件</title> </head> <body> <button id="get-file-btn">点击获取文本文件</button> <textarea id="file-content" rows="15" cols="80" readonly style="margin-top:20px;"></textarea> <script> // 监听按钮点击事件 document.getElementById('get-file-btn').addEventListener('click', function() { // 发起fetch请求 fetch('/roumer') .then(res => res.json()) .then(data => { if (data.success) { // 把内容填充到textarea document.getElementById('file-content').value = data.content; } else { // 提示错误信息 alert(data.message); } }) .catch(err => { console.error('请求出错:', err); alert('获取文件时发生未知错误'); }); }); </script> </body> </html>
4. 推荐:用axios替代request(因为request已停止维护)
先安装axios:
npm install axios
然后路由代码改成异步/await风格(更简洁易读):
const axios = require('axios'); const express = require('express'); const router = express.Router(); router.get('/roumer', async (req, res) => { try { // 发起GET请求 const response = await axios.get('http://177.77.45.99:8081/gall/cesar.txt'); // 同步跳转的话用render,异步的话用json res.render('file-view', { fileContent: response.data }); // res.json({ success: true, content: response.data }); } catch (error) { console.error('请求出错:', error); const errorMsg = error.response ? `请求失败,状态码: ${error.response.status}` : '获取文件失败,请稍后重试'; res.render('file-view', { fileContent: errorMsg }); // res.json({ success: false, message: errorMsg, content: '' }); } }); module.exports = router;
内容的提问来源于stack exchange,提问作者Aldem
相关产品推荐
相关产品推荐

