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

如何用Node.js触发客户端JavaScript函数并同步API数据至前端?

实现Node.js与前端数据同步及函数触发的方案

下面是几种实用的实现方式,可根据你的场景选择:

一、前端定时轮询(快速上手)

前端定期向Node.js查询最新数据,拿到数据后触发展示函数。这种方式无需复杂的长连接,适合数据更新频率不高的场景。

Node.js 后端代码(Express框架)

const express = require('express');
const app = express();
app.use(express.json());

// 暂存外部程序发来的最新数据(生产环境建议用数据库/缓存)
let latestData = null;

// 接收外部程序的请求,存储数据
app.post('/apiResponse', (req, res) => {
  latestData = req.body;
  res.status(200).send('数据已接收');
});

// 提供给前端查询数据的接口
app.get('/getLatestData', (req, res) => {
  res.json(latestData || {});
});

app.listen(3000, () => console.log('服务运行在 http://localhost:3000'));

前端代码

// 定时拉取数据的函数
function fetchAndRenderData() {
  fetch('http://localhost:3000/getLatestData')
    .then(res => res.json())
    .then(data => {
      if (Object.keys(data).length > 0) {
        // 触发自定义函数展示数据
        renderData(data);
      }
    })
    .catch(err => console.error('拉取数据失败:', err));
}

// 每3秒查询一次(可根据需求调整间隔)
setInterval(fetchAndRenderData, 3000);

// 自定义的页面展示函数
function renderData(data) {
  const container = document.getElementById('data-display');
  container.textContent = JSON.stringify(data, null, 2);
}

二、Server-Sent Events(SSE,单向实时推送)

Node.js在收到外部数据后,主动推送给已建立长连接的前端,前端实时触发处理函数。适合仅后端向前端推送数据的场景。

Node.js 后端代码

const express = require('express');
const app = express();
app.use(express.json());

// 存储SSE客户端连接
const connectedClients = [];

// 接收外部程序的数据并推送给前端
app.post('/apiResponse', (req, res) => {
  const newData = req.body;
  // 向所有连接的前端推送数据
  connectedClients.forEach(client => {
    client.write(`data: ${JSON.stringify(newData)}\n\n`);
  });
  res.status(200).send('数据已推送至前端');
});

// 建立SSE连接的接口
app.get('/sse', (req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });
  // 将当前连接加入列表
  connectedClients.push(res);
  // 客户端断开连接时清理
  req.on('close', () => {
    const index = connectedClients.indexOf(res);
    if (index !== -1) connectedClients.splice(index, 1);
  });
});

app.listen(3000, () => console.log('服务运行在 http://localhost:3000'));

前端代码

// 建立SSE连接
const eventSource = new EventSource('http://localhost:3000/sse');

// 接收后端推送的数据并触发展示函数
eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  renderData(data);
};

// 处理连接错误
eventSource.onerror = (err) => {
  console.error('SSE连接异常:', err);
  eventSource.close();
};

function renderData(data) {
  const container = document.getElementById('data-display');
  container.textContent = JSON.stringify(data, null, 2);
}

三、WebSocket(双向实时通信)

支持前后端双向交互,Node.js收到外部数据后主动推送给前端,同时前端也能向后端发送指令。适合需要实时双向通信的复杂场景。

Node.js 后端代码(使用ws库)

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
app.use(express.json());
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 存储WebSocket客户端
const clients = new Set();

// 处理WebSocket连接
wss.on('connection', (ws) => {
  clients.add(ws);
  // 客户端断开时移除
  ws.on('close', () => clients.delete(ws));
});

// 接收外部程序的数据并推送给前端
app.post('/apiResponse', (req, res) => {
  const newData = req.body;
  clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify(newData));
    }
  });
  res.status(200).send('数据已推送至前端');
});

server.listen(3000, () => console.log('服务运行在 http://localhost:3000'));

前端代码

// 建立WebSocket连接
const socket = new WebSocket('ws://localhost:3000');

// 连接成功提示
socket.onopen = () => console.log('WebSocket连接已建立');

// 接收后端推送的数据并触发展示函数
socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  renderData(data);
};

// 处理连接错误
socket.onerror = (err) => console.error('WebSocket异常:', err);

// 连接关闭提示
socket.onclose = () => console.log('WebSocket连接已关闭');

function renderData(data) {
  const container = document.getElementById('data-display');
  container.textContent = JSON.stringify(data, null, 2);
}

内容的提问来源于stack exchange,提问作者NathaThink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:52