You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:05