javascript - 如何通过自定义服务器访问 next.js 呈现的 HTML
问题描述
我希望将 next.js 中的服务器端生成页面作为文件提供。所以我想在自定义 server.js 文件中获取呈现的内容:
const express = require('express');
const next = require('next');
const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({dev});
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = express();
server.get('/', async (req, res) => {
const nextResponse = await app.renderToHTML(req, res, '/', req.query);
console.log('nextResponse', nextResponse);
console.log('res.body', res.body);
});
server.get('*', (req, res) => {
return handle(req, res);
});
server.listen(port, (err) => {
if (err) throw err;
console.log(`> Ready on http://localhost:${port}`);
});
});
奇怪的是,每个 console.log 都返回 null 或 undefined。我认为这renderToHTML
只会返回呈现的 HTML 字符串。有没有办法做到这一点?
解决方案
这有点棘手,但可以实现。
这个想法是覆盖res.end
函数以便在那里捕获呈现的 HTML。棘手的部分是 Next.js gzips 和流响应使用覆盖函数中间某处的压缩库。res.end
handle
压缩库是使用handleCompression
Next.js 的 Server 对象(可使用 访问app.getServer()
)的函数初始化的,因此该函数也需要被覆盖。
所以它应该看起来像这样:
const { parse } = require('url');
const next = require('next');
const express = require('express');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const port = process.env.PORT || 3000;
const handle = app.getRequestHandler();
app.prepare()
.then(() => {
const server = express();
server.get('*', async (req, res) => {
const parsedUrl = parse(req.url, true);
const nextServer = await app.getServer();
const _handleCompression = nodeServer.handleCompression.bind(nodeServer);
nextServer.handleCompression = (req, res) => {
_handleCompression(req, res);
const _resEnd = res.end.bind(res)
res.end = function (payload) {
console.log('Rendered HTML: ', payload);
return _resEnd(payload);
}
}
return handle(req, res, parsedUrl);
});
server.listen(port, err => {
if (err) throw err;
console.log('> Ready on http://localhost:' + port);
});
});
获得呈现的 HTML 后,您不必使用已保存的_resEnd
功能。随意操作,作为文件,或任何你想要的。
推荐阅读
- python - NameError:名称'myemailaddress'未在python中定义
- ruby-on-rails - 定制设计注册
- python - 例外:针对 Office 365 进行身份验证时出错。来自 Office 365 的错误,AADSTS50126:由于名称或密码无效,验证凭据时出错
- excel - Azure 到 Excel - 连接问题
- multithreading - tkinter 多次点击按钮的状态
- java - 使用 Java API 根据条件更新 ElasticSearch 文档
- powershell - 从 VM 远程连接到 Hyper-V 机器
- javascript - 在redux effects中,我使用yield将一些数据放入redux状态,anther async function无法获取它
- visual-studio-code - VSCode 如何触发字符串中的建议
- json - 获取 swagger UI 中所有 API 的 curl