每当我尝试使用makeStyles()具有生命周期方法的组件时,都会出现以下错误:
无效的挂接调用。挂钩只能在功能组件的主体内部调用。可能由于以下原因之一而发生:
- 您可能使用了不匹配的React和渲染器版本(例如React DOM)
- 您可能正在违反挂钩规则
- 您可能在同一应用程序中拥有多个React副本
下面是产生此错误的代码的一个小示例。其他示例也将类分配给子项。我在MUI的文档中找不到任何显示其他使用方式makeStyles并可以使用生命周期方法的功能。
import React, { Component } from 'react';
import { Redirect } from 'react-router-dom';
import { Container, makeStyles } from '@material-ui/core';
import LogoButtonCard from '../molecules/Cards/LogoButtonCard';
const useStyles = makeStyles(theme => ({
root: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
},
}));
const classes = useStyles();
class Welcome extends Component {
render() {
if (this.props.auth.isAuthenticated()) {
return <Redirect to="/" />;
}
return (
<Container maxWidth={false} className={classes.root}>
<LogoButtonCard
buttonText="Enter"
headerText="Welcome to PlatformX" …Run Code Online (Sandbox Code Playgroud) 我们最近转移到 Heroku,并在尝试将我们的应用程序连接到数据库时,它不断拒绝我们的查询,并显示消息“自签名证书”。传递rejectUnauthorized解决了这个问题,但现在我想知道,我们应该在生产中这样做吗?如果没有,我们连接到 Heroku PG 数据库的合适方法是什么?
const pgp = require('pg-promise')(/*initOptions*/);
const {ConnectionString} = require('connection-string');
const cnObj = new ConnectionString(process.env.DATABASE_URL);
const cn = {
host: cnObj.hostname,
port: cnObj.port,
database: cnObj.path?.[0],
user: cnObj.user,
password: cnObj.password,
ssl: {
rejectUnauthorized: false,
},
};
const db = pgp(cn);
Run Code Online (Sandbox Code Playgroud) 我进行了搜索,令人惊讶的是没有找到答案。现在,我们不会将 API Keys/.env文件提交到一个不断增长的 4 人团队正在开发的存储库中。每当我们更改某些内容时,例如数据库密码,我们都会通过 Slack 将其发送给彼此。
考虑到我们的 repo 是私有的,不可分叉,并且只有员工可以访问,这似乎毫无意义。
我能看到这种情况出错的唯一方法是:
我们是否有理由继续这种做法,或者我们可以提交我们的.env文件吗?
我们正在构建一个带有 React/Redux 前端和 NodeJS/Express 后端的应用程序。我不是安全专家,而是选择使用 Auth0 来处理身份验证。
当用户登录时,Auth0 会返回一个 ID 令牌和一个访问令牌,此访问令牌用于验证和访问我们的后端 API。
我们已经看到这个访问令牌之前存储在本地存储中,但 Auth0 然后与此处相矛盾。此外,在这个答案中,似乎有些人建议将其存储在 Local Storage 中,就像this one 一样。
这让我非常困惑。我们如何在不将其存储在内存中的情况下存储和持久化令牌?我们只能将它存储在 Redux 中,但它会在刷新时清除,这不是解决方案。
在这里,他们显示用户登录并返回访问令牌,稍后它将与 API 请求一起发送,我理解,但同时将其存储在哪里?
我们应该如何存储访问令牌以便我们的应用程序可以访问我们的 API?或者我们根本不应该存储它?
使用pg-promise,使用$1模板文字有什么好处吗?模板文字对我来说更熟悉,但我必须假设他们由于这个包的原因而以不同的方式做。
“正常”方式:
db.any('SELECT * FROM users WHERE active = $1', [true])
Run Code Online (Sandbox Code Playgroud)
我这样做的方式:
const isTrue = true;
db.any(`SELECT * FROM users WHERE active = ${isTrue}`)
Run Code Online (Sandbox Code Playgroud)
更新了我的做法:
const isTrue = true;
const name = 'Matt'
db.any('SELECT * FROM users WHERE active = $1 AND name = $2', [isTrue, name])
Run Code Online (Sandbox Code Playgroud)
或者
const isTrue = true;
const name = 'Matt'
db.any(`SELECT * FROM users WHERE active = $/isTrue/ AND name = $/name/`, {isTrue, name})
Run Code Online (Sandbox Code Playgroud) pg-promise ×2
postgresql ×2
access-token ×1
auth0 ×1
git ×1
github ×1
jwt ×1
material-ui ×1
node.js ×1
reactjs ×1
redux ×1
security ×1
ssl ×1