【发布时间】:2020-06-24 21:08:17
【问题描述】:
我正在为我姐姐建立一个网站,以便她可以出售她的艺术品。我正在使用 Next.js 来设置所有内容。该网站通过从数据库中抓取一个数组并通过它映射来呈现艺术作品。
两个示例对象
{
id: 8,
path: "images/IMG_0008.jpg",
size: "9x12x.75",
price: "55",
sold: false
}
{
id: 9,
path: "images/IMG_0009.jpg",
size: "9x12x.75",
price: "55",
sold: false
}
pages/Shop.js
import Card from "../Components/Card";
import fetch from 'node-fetch'
import Layout from "../components/Layout";
function createCard(work) {
return (
<Card
key={work.id}
id={work.id}
path={work.path}
size={work.size}
price={work.price}
sold={work.sold}
/>
);
}
export default function Shop({artwork}) {
return (
<Layout title="Shop">
<p>This is the Shop page</p>
{artwork.map(createCard)}
</Layout>
);
}
export async function getStaticProps() {
const res = await fetch('http://localhost:3000/api/get-artwork')
const artwork = await res.json()
return {
props: {
artwork,
},
}
}
我遇到的问题是,当我尝试在 api/get-artwork 中使用 mongoose 时。它只会呈现页面一次,一旦刷新它就会破坏我相信架构和模型重做的事实。
pages/api/get-artwork.js/
const mongoose = require("mongoose");
mongoose.connect('mongodb://localhost:27017/ArtDB', {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
});
const itemsSchema = {
id: String,
description: String,
path: String,
size: String,
price: Number,
sold: Boolean
};
const Art = mongoose.model("Art", itemsSchema);
export default (req, res) => {
Art.find({sold: false}, (err, foundItems)=> {
if (err) {
console.log(err);
} else {
console.log(foundItems);
res.status(200).json(foundItems);
}
});
};
为了解决这个问题,我决定使用原生 MongoDB 驱动程序。像这样。
/pages/api/get-artwork/
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'ArtDB';
// Create a new MongoClient
const client = new MongoClient(url, {useUnifiedTopology: true});
let foundDocuments = ["Please Refresh"];
const findDocuments = function(db, callback) {
// Get the documents collection
const collection = db.collection('arts');
// Find some documents
collection.find({}).toArray(function(err, arts) {
assert.equal(err, null);
foundDocuments = arts;
callback(arts);
});
}
// Use connect method to connect to the Server
client.connect(function(err) {
assert.equal(null, err);
const db = client.db(dbName);
findDocuments(db, function() {
client.close();
});
});
export default (req, res) => {
res.send(foundDocuments);
};
这在大多数情况下都有效,但有时不会返回数组。我认为这是因为页面在 mongodb 部分完成之前加载?所以我想我的问题是我如何 100% 确保它每次都能正确加载艺术作品,无论是使用猫鼬还是原生驱动程序。
谢谢!
【问题讨论】:
-
如果不浏览所有代码就很难说,但我记得在使用 axios 时遇到了获取问题,切换到 isomorphic-unfetch 并且一切正常,如果你有时间github.com/syahmiyani/tpkprinting.now.sh.
标签: javascript reactjs mongodb next.js