【发布时间】:2020-09-18 16:07:52
【问题描述】:
我正在使用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();
};
我将新数组发送到后端,拖放后的所有内容都按顺序排列。问题是我真的不知道如何在后端处理它。我是否需要删除所有记录,然后遍历数组并插入新记录?我最初想遍历记录并更新它们,但它实际上并没有做任何事情,可能是因为代码错误或我的逻辑错误,因为它所做的只是用完全相同的数据覆盖,因为所有改变的是数组的顺序,而不是数组中的实际 id 或 _id。
exports.faqSort = async (req, res) => {
const { order } = req.body;
console.log(order);
await order.map((o) => {
Faq.update({ _id: o._id }, { $set: { id: o.id } });
});
};
这是页面加载时的数组:
[
{
_id: '5ed273049b268308302cb1fb',
question: 'question 1',
answer: 'answer 1',
id: 1,
__v: 0
},
{
_id: '5ed273439b268308302cb1fd',
question: 'question 2',
answer: 'answer 2',
id: 2,
__v: 0
},
{
_id: '5ed276129b268308302cb1ff',
question: 'quesiton 3',
answer: 'answer 3',
id: 3,
__v: 0
}
]
这是我发送到后端的新数组
[
{
_id: '5ed276129b268308302cb1ff',
question: 'quesiton 3',
answer: 'answer 3',
order: 3,
__v: 0
},
{
_id: '5ed273049b268308302cb1fb',
question: 'question 1',
answer: 'answer 1',
order: 1,
__v: 0
},
{
_id: '5ed273439b268308302cb1fd',
question: 'question 2',
answer: 'answer 2',
order: 2,
__v: 0
}
]
【问题讨论】:
-
您想在数据库中存储/维护项目的自定义顺序,对吗?就像拖放项目列表并保持顺序不变。我有同样的问题stackoverflow.com/questions/59193436/…,但还没有找到任何解决方案。奇怪的是我还没有发现任何问题,因为我认为这是一个非常基本的问题。
-
是的,我在数据库中有一个订单号列,即:1、2、3、4、5。这基本上是一个排序顺序列,不同于主键 ID 或长创建新记录时获得的 mongo id。在前端,我按排序顺序排序,但也试图找出在拖放后保留数据的逻辑。
-
你的模型怎么样?
-
我的模型看起来很正常(猫鼬),除了我有一个自动增量包,因此我的排序列有一个自动增量编号。它非常易于使用,可以在这里找到:npmjs.com/package/mongoose-sequence
-
为什么我们需要发送整个数组来改变顺序?我们不能只发送源和目标两个 id 并仅更新这两个 id 的顺序吗?我认为这可以通过唯一的订单索引和 _id
标签: node.js reactjs mongodb mongoose