- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在客户端和服务器上呈现的 React 应用程序。当任何组件的 render() 失败时(由于我的代码中的错误,例如试图读取 undefined object 的属性),然后如果我从浏览器中的另一个页面导航,那么我会在浏览器开发者控制台。
但是,当我触发相同代码的服务器端呈现(通过直接将浏览器指向包含故障组件的有问题的路由)时,我只会在服务器的控制台中收到如下错误:
(node:97192) UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:1):TypeError:无法读取未定义的属性“tagDefinitionId”
没有堆栈跟踪,调试起来有点困难。
问题:有没有办法在服务器端渲染期间一揽子捕获所有 render() 失败?
触发服务器端渲染以响应被请求的 Node-Express 端点的代码如下。我相信未处理的 promise 拒绝发生在 renderToString() 内部,但此函数返回一个字符串,而不是 promise。
`
import configureStore from '../../redux/store';
import { renderToString } from 'react-dom/server';
import { Provider } from 'react-redux';
import React from 'react';
import RouterContext from 'react-router/lib/RouterContext';
import createMemoryHistory from 'react-router/lib/createMemoryHistory';
import match from 'react-router/lib/match';
import template from './template';
import routes from '../../routes';
const clientAssets = require(KYT.ASSETS_MANIFEST);
app.use((request, response) => {
const history = createMemoryHistory(request.originalUrl);
match({ routes, history }, (error, redirectLocation, renderProps) => {
if (error) {
response.status(500).send(error.message);
} else if (redirectLocation) {
response.redirect(302, `${redirectLocation.pathname}${redirectLocation.search}`);
} else if (renderProps) {
// This is the initial store
const store = configureStore();
// When a React Router route is matched then we render
// the components and assets into the template.
const render = () => {
// Grab the initial state from our Redux store
const initialState = JSON.stringify(store.getState());
let isNotFoundRoute = false;
if (renderProps.routes[1].path === '*') {
isNotFoundRoute = true;
}
// Populate the HTML document with the current redux store
response.status(isNotFoundRoute ? 404 : 200).send(template({
root: renderToString(
<Provider store={store}>
<RouterContext {...renderProps} />
</Provider>
),
cssBundle: clientAssets.main.css,
jsBundle: clientAssets.main.js,
initialState,
}));
};
// Fetch the components from the renderProps and when they have
// promises, add them to a list of promises to resolve before starting
// a HTML response
fetchComponentData(store.dispatch, renderProps.components, renderProps.params).then(render);
} else {
response.status(404).send('Not found');
}
});
});
`
我认为唯一可能与此处相关的自定义代码导入是 template.js:
`
import Helmet from 'react-helmet';
export default (vo) => {
const helmet = Helmet.rewind();
return `
<!DOCTYPE html>
<html lang="en" ${helmet.htmlAttributes.toString()} >
<head>
${helmet.title.toString()}
<meta httpEquiv="X-UA-Compatible" content="IE=edge" />
<meta charSet='utf-8' />
<meta httpEquiv="Content-Language" content="en" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="white" />
${helmet.meta.toString()}
${helmet.link.toString()}
<link id="favicon" rel="shortcut icon" href="/favicon.png" sizes="16x16 32x32" type="image/png" />
<link rel="manifest" href="manifest.json">
${vo.cssBundle ? '<link rel="stylesheet" type="text/css" href="' + vo.cssBundle + '">' : ''}
</head>
<body ${helmet.bodyAttributes.toString()} >
<div id="root" class="root"><div>${vo.root}</div></div>
<script>
window.__PRELOADED_STATE__ = ${vo.initialState}
</script>
<script async src="${vo.jsBundle}"></script>
</body>
</html>
`;
};
`
最佳答案
是的,有a catch-all您可以使用它来记录未处理的拒绝的堆栈跟踪,但您最好简单地处理它们。事实上,当您的 render
函数中的某些内容抛出异常时,没有任何东西会捕捉到它。
我建议将您的脚本重组为
app.use((request, response) => {
const history = createMemoryHistory(request.originalUrl);
new Promise((resolve, reject) => {
match({ routes, history }, (error, redirectLocation, renderProps) => {
if (error) reject(error);
else resolve({redirectLocation, renderProps});
}).then(({redirectLocation, renderProps}) => {
if (redirectLocation) {
return {status: 302, target: redirectLocation.pathname + redirectLocation.search};
} else if (!renderProps) {
return {status: 404, content: 'Not found'};
} else {
const store = configureStore();
return fetchComponentData(store.dispatch, renderProps.components, renderProps.params).then(() => {
const initialState = JSON.stringify(store.getState());
const isNotFoundRoute = (renderProps.routes[1].path === '*');
const content = template({
root: renderToString(
<Provider store={store}>
<RouterContext {...renderProps} />
</Provider>
),
cssBundle: clientAssets.main.css,
jsBundle: clientAssets.main.js,
initialState,
});
return {status: isNotFoundRoute ? 404 : 200, content};
});
}
}).catch(err => { // THIS IS IMPORTANT!
console.error(err); // or err.message and err.stack and everything, maybe including route
return {status: 500, content: 'Sorry, we\'ll look into it'}; // or err.message if you trust it
}).then(({status, target, content}) => {
if (status >= 300 && status < 400)
response.redirect(status, target);
else
respose.status(status).send(content);
if (status >= 400)
console.debug(…)
});
});
关于javascript - 无法在 React 服务器端渲染中处理 UnhandledPromiseRejectionWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45414673/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!