我正在尝试运行此代码
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请求,而不在内部调用它?
有什么想法吗?
答案 0 :(得分:2)
一旦致电res.render()
,您将无法再向客户端发送任何数据,http响应已发送,并且http连接已完成-您无法再向其发送任何信息。因此,在致电res.render()
之后尝试在响应中添加更多内容是没有好处的。
听起来您正在尝试将一些数据放入发送到浏览器的脚本中。您可以选择以下两种方式之一:
在调用let data = await fn()
之前,先使用res.render()
获取所需的数据,然后将其传递给res.render()
,以便模板引擎可以将这些数据放入脚本文件中发送服务器(在发送之前)。
您将需要更改脚本文件模板才能执行此操作,因此它具有将数据插入脚本文件中的适当指令,并且必须非常小心地将数据格式化为Javascript数据结构。
在页面中具有脚本进行ajax调用以获取所需的数据,然后在页面已经启动并运行后使用客户端Javascript执行任务。
对于您了解浏览器和服务器之间的确切顺序似乎很有帮助。
因此,您显示的代码似乎是其中一个脚本文件的路由(在上面的步骤5中)。在这里,它适合装入页面的总体方案。使用res.render()
将脚本文件返回给客户端后,该脚本文件已发送并且该请求已完成。浏览器不再为该资源连接到服务器,因此您无法在同一请求上发送任何其他信息。