gpt4 book ai didi

javascript - 是否可以在 next.js api 中运行 Mongoose?

转载 作者:行者123 更新时间:2023-12-03 07:20:43 24 4
gpt4 key购买 nike

我正在为我姐姐建立一个网站,以便她可以出售她的艺术品。我正在使用 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
}

页面/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 时。它只会呈现页面一次,一旦刷新它就会破坏我相信架构和模型重做的事实。

页面/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);
}
});

};

所以为了解决这个问题,我决定使用 native 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 部分完成之前加载?所以我想我的问题是,无论是使用 Mongoose 还是 native 驱动程序,我如何才能 100% 确保它每次都能正确加载艺术作品。

谢谢!

最佳答案

Next.js 团队有一组很好的示例代码,他们会定期添加,其中之一是 Next.js 与 MongoDB 和 Mongoose。看看吧,https://github.com/vercel/next.js/tree/canary/examples/with-mongodb-mongoose ,如果您仍在寻找解决方案,希望这对您有所帮助。

关于javascript - 是否可以在 next.js api 中运行 Mongoose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60660488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com