重新发送后运行功能

时间:2019-12-09 22:45:26

标签: node.js express

我正在尝试运行此代码

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请求,而不在内部调用它?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

一旦致电res.render(),您将无法再向客户端发送任何数据,http响应已发送,并且http连接已完成-您无法再向其发送任何信息。因此,在致电res.render()之后尝试在响应中添加更多内容是没有好处的。

听起来您正在尝试将一些数据放入发送到浏览器的脚本中。您可以选择以下两种方式之一:

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

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


对于您了解浏览器和服务器之间的确切顺序似乎很有帮助。

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

因此,您显示的代码似乎是其中一个脚本文件的路由(在上面的步骤5中)。在这里,它适合装入页面的总体方案。使用res.render()将脚本文件返回给客户端后,该脚本文件已发送并且该请求已完成。浏览器不再为该资源连接到服务器,因此您无法在同一请求上发送任何其他信息。