gpt4 book ai didi

node.js - res.send 之后运行函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:12:53 24 4
gpt4 key购买 nike

我正在尝试运行此代码

module.exports = async (req, res, next) => {

res.set('Content-Type', 'text/javascript');

const response = {};

res.status(200).render('/default.js', { response });

await fn(response);
};

fn 是一个调用服务 api 的函数,该服务将向客户端输出一些内容。但它依赖于首先加载的 default.js 文件。如何做类似的事情

res.render('/default.js', { response }).then(async() => {
await fn(response);
};

尝试过,但似乎不喜欢then()

此外,fn 不会向客户端返回数据,它会调用一个 api 服务,该服务与渲染的 default.js 代码打开的 Web 套接字连接。

我是否必须为 fn 调用发出 ajax 请求而不是在内部调用它?

有什么想法吗?

最佳答案

一旦调用 res.render(),您就无法再向客户端发送任何数据,http 响应已发送且 http 连接已完成 - 您无法再向客户端发送任何数据。因此,在调用 res.render() 后尝试向响应中添加更多内容对您没有任何好处。

听起来您正在尝试将一些数据放入发送到浏览器的脚本中。您的选择是:

  1. 在调用 res.render() 之前使用 let data = wait fn() 获取所需的数据,然后将其传递给 res.render(),以便模板引擎可以将该数据放入您发送到服务器的脚本文件中(在发送之前)。您需要更改脚本文件模板才能执行此操作,以便它具有将数据插入脚本文件的适当指令,并且您必须非常小心地将数据格式化为 Javascript 数据结构。

  2. 让页面中的脚本进行 ajax 调用以获取所需的数据,然后在页面启动并运行后在客户端 Javascript 中执行任务。

<小时/>

看起来这可能对您了解浏览器和服务器之间事物的确切顺序有所帮助。

  1. 浏览器正在显示某个网页。
  2. 用户点击新网页的链接。
  3. 浏览器向服务器请求特定 URL 的新网页。
  4. 服务器为该 URL 提供 HTML 页面。
  5. 浏览器解析该 HTML 页面并发现呈现该页面所需的一些其他资源(脚本文件、CSS 文件、图像、字体等...)
  6. 浏览器从服务器请求其他资源
  7. 服务器获取对每个单独资源的请求,并将每个资源返回给浏览器。
  8. 浏览器将这些资源合并到之前下载并解析的 HTML 页面中。
  9. 然后运行它为该页面检索到的任何客户端脚本。

因此,您显示的代码似乎是脚本文件之一的路径(在上面的步骤 5 中)。这是它适合加载页面的整体方案的地方。使用 res.render() 将脚本文件返回给客户端后,该文件就已发送并且请求已完成。浏览器不再连接到您的服务器来获取该资源,因此您无法针对同一请求发送任何其他内容。

关于node.js - res.send 之后运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59257752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com