下面是我使用的React表单验证代码formik。默认情况下,当表单加载时,我想禁用提交按钮:
import { useFormik } from "formik";
import * as Yup from "yup";
const formik = useFormik({
initialValues: {
firstName: "",
lastName: "",
email: ""
},
validationSchema: Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.min(3, "Must be at least 3 characters")
.required("Required"),
lastName: Yup.string()
.min(3, "Must be at least 3 characters")
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required")
}),
onSubmit: values => {
handleSubmit(values);
}
}); …Run Code Online (Sandbox Code Playgroud) 我只在 Mongodb 云数据库(Atlas)中一次删除一条记录。我有 60 条记录要删除,这很痛苦。我没有看到一次删除多个记录的明显方法。有没有一种简单的方法可以做到这一点?
我正在使用 Next Auth 并运行一个独立的 Node.js API。我正在使用使用凭证的 Next Auth 并使用 axios 将用户名和密码发送到 API。
在 API 方面,如果用户名和密码正确,我将使用 express-session 设置会话并将其保存到数据库中。
如果 Next.js 中的响应状态为 201,我想将 API 中的快速会话令牌添加到我的 Next.js 会话中。
下面的代码正在工作,我进行身份验证,当我在受保护的页面中进行 console.log 会话时,我看到在服务器上设置的快速会话令牌。该令牌也存储在 mongoDB 中。但这是正确的吗?这样做的目的只是为了保护前端的路由,即:检查 Next.js 中是否有会话
如果在受保护的页面上我需要发出 API 请求,我是否会根据登录用户的数据库令牌检查该会话令牌?
最后,JWT 在这里适合什么,这是 Next.js 使用 JWT 处理客户端身份验证会话的方式吗?
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import axios from "axios";
export default NextAuth({
session: {
jwt: true,
maxAge: 30 * 24 * 60 * 60,
},
providers: [
CredentialsProvider({
async authorize(credentials) {
try {
const response = …Run Code Online (Sandbox Code Playgroud) 我正在将一个项目从 React 转移到 Next.js 并且想知道相同的身份验证过程是否可以。基本上,用户输入他们的用户名和密码,然后通过 API (Node.js/Express) 对照数据库凭据进行检查。因此,我没有使用 Next.js 内部 api 功能,而是使用与我的 Next.js 项目完全分离的 API。
如果登录凭据正确,则会将 JWT 令牌发送回客户端。我想将其存储在本地存储中,然后重定向用户。任何未来的 http 请求都将在标头中发送令牌并通过 API 检查它是否有效。这样做可以吗?我问是因为我看到很多 Next.js auth 使用 cookie 或会话,但不知道这是否是我应该采用的“标准”方法。
我正在使用useSWR来获取数据,然后使用这些数据,我想通过使用reduce 来获得总计。如果我 console.log 输出该值,它工作正常,但一旦我尝试使用该值设置状态,我就会收到“太可能重新渲染”消息。
import Admin from "../../../components/admin/Admin";
import { useRouter } from "next/router";
import styles from "../../../styles/Dashboard.module.css";
import { getSession, useSession } from "next-auth/client";
import { useState } from "react";
/* BOOTSTRAP */
import Col from "react-bootstrap/Col";
import Container from "react-bootstrap/Container";
import Row from "react-bootstrap/Row";
import Spinner from "react-bootstrap/Spinner";
import Table from "react-bootstrap/Table";
import useSWR from "swr";
import axios from "axios";
const General = () => {
const [session, loading] = useSession();
const [adults, setAdults] = useState(null); …Run Code Online (Sandbox Code Playgroud) 我正在使用React-sortable-hoc来拖放和重新排序项目。当我这样做时,我想更新数据库(node.js 和 mongodb)。
首先,我将其更改为函数组件,这就是为什么我的语法看起来与示例有点不同。
const onSortEnd = ({ oldIndex, newIndex }) => {
setItems((items) => arrayMove(items, oldIndex, newIndex));
const newArray = arrayMove(items, oldIndex, newIndex);
async function makePatchRequest() {
const config = {
method: "patch",
url: "http://localhost:8000/api/admin/faq/order",
headers: { Authorization: "Bearer " + auth.token },
data: {
order: newArray,
},
};
let res = await axios(config, { order: newArray });
}
makePatchRequest();
};
Run Code Online (Sandbox Code Playgroud)
我将新数组发送到后端,其中所有内容都按拖放后的顺序排列。问题是我真的不知道在后端如何处理它。我是否需要删除所有记录,然后循环数组并插入新记录?我最初想循环记录并更新它们,但它实际上没有做任何事情,可能是因为代码错误或者我的逻辑错误,因为它所做的只是用完全相同的数据覆盖,因为所有改变的是数组的顺序,而不是数组中的实际 id 或 _id。
exports.faqSort = async (req, res) => {
const { order } = …Run Code Online (Sandbox Code Playgroud) 我正在使用.pull从 mongo db 中的数组中删除记录并且它工作正常,但是我在堆栈溢出的某处读到的评论(无法再次找到它来发布链接)困扰着我,因为它评论说它很糟糕使用.save而不是使用.findByIdAndUpdate或.updateOne
我只是想知道这是准确的还是主观的。
这就是我目前的做法。我检查具有该 id 的产品是否确实存在,如果存在,我从数组中提取该记录。
exports.deleteImg = (req, res, next) => {
const productId = req.params.productId;
const imgId = req.params.imgId;
Product.findById(productId)
.then(product => {
if (!product) {
return res.status(500).json({ message: "Product not found" });
} else {
product.images.pull(imgId);
product.save()
.then(response => {
return res.status(200).json( { message: 'Image deleted'} );
})
}
})
.catch(err => {
console.log(err);
});
};
Run Code Online (Sandbox Code Playgroud)
我认为他们所说的应该是做这样的事情(我在谷歌之后找到的一个例子)
users.findByIdAndUpdate(userID,
{$pull: {friends: friend}},
{safe: true, upsert: true},
function(err, doc) { …Run Code Online (Sandbox Code Playgroud) 我已经花了数小时试图弄清楚这一点,但是却被严重卡住了。我今天安装了最新版本的mysql,我的网站上的某些东西坏了。我认为这与严格的设置有关,例如IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
我试图禁用严格模式只是为了使我的网站正常工作,但这似乎是不可能的。我已经在终端尝试过了,但是没有运气。
sudo vim /etc/mysql/conf.d/disable_mysql_strict_mode.cnf
[mysqld]
sql_mode="IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
我查看了所有可以找到的etc文件夹以及其他各种文件夹,但看不到任何类似于.cnf文件的内容。
我可以通过phpmyadmin临时执行此操作,但是如果我关闭MAMP或重新启动计算机,则由于更改不是永久性的,因此必须再次执行。
我看过 2 个不同的例子,想知道哪个是“正确的”,或者它是否没有太大区别。示例 1 在 try 内部发送响应,示例 2 在 try 块外部发送。
示例 1:
try {
await food.save();
res.status(201).send(food);
} catch (err) {
res.status(500).send(err);
}
Run Code Online (Sandbox Code Playgroud)
示例 2:
try {
await food.save();
} catch (err) {
res.status(500).send(err);
}
res.status(201).send(food);
Run Code Online (Sandbox Code Playgroud) 我使用第三方脚本上传文件,当我上传多个文件时,我得到这种格式的名称:
[{"file":"0:/gIpVCEAe4eiW.jpg"},{"file":"0:/5yA9n2IfNh65.jpg"}]
Run Code Online (Sandbox Code Playgroud)
我只想要实际的文件名.我希望我可以发布一些我尝试过的代码,但我想不出很多选择.我不能单独得到.split来做我想做的事.
我必须使用聚合在对象数组中查找用户 ID,一旦获得它,我想用该 ID 更新文档。但是,当我尝试像使用后那样调用 .save() 时Product.findById(productId),我收到一个错误,该错误仅在我使用聚合时发生。
Product.save 不是一个函数
exports.putGift = (req, res, next) => {
const productId = req.body.productId;
const requestId = req.body.requestId;
Product.aggregate([
{ $match: { _id: mongoose.Types.ObjectId(productId) } },
{ $unwind: "$requests" },
{ $match: { "requests._id": mongoose.Types.ObjectId(requestId) } },
{ $project: { "requests.userId": 1 } }
])
.then(product => {
const userId = product[0].requests.userId;
product.winner = userId;
product.status = "given";
return product.save()
.then(result => {
console.log("success");
});
})
.catch(err => {
console.log(err);
});
};
Run Code Online (Sandbox Code Playgroud) 我在 mongodb 中有一条记录,其中包含我想在前端显示的图像的文件名,即:react。图片名称在mongodb中为portraits.jpg。
首先,我应该将路径名也保存到 mongo 中还是只保存图像名称,即:/img/portraits.jpg vs portraits.jpg
其次,如何在 React 中显示图像?
我使用 axios 从数据库获取数据,然后将数据发送到另一个组件:
const { categories } = this.props;
{categories.map(category => (
<Col md={6} className="mb-3" key={category._id}>
<Figure className="cat-photo">
<h1>{category.name}</h1>
<img src={category.catimg} className="img-fluid" />
</Figure>
</Col>
))}
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中查看源代码时,它正在查看,http://localhost:3000/img/portraits.jpg但 node.js 服务器正在端口 8000 上运行。所以,我猜测这就是为什么没有显示图像的原因,因为图像位于服务器上且无处可去在 React 文件结构中找到。
node.js ×6
reactjs ×5
mongodb ×4
mongoose ×4
next.js ×3
express ×1
formik ×1
javascript ×1
mysql ×1
next-auth ×1
phpmyadmin ×1
swr ×1
validation ×1
yup ×1