MongoDB Atlas在本地主机上工作,但不在生产上(NextJs on Vercel)



我将NextJs应用程序与MongoDB Atlas连接。它在本地主机上工作正常,但在Production hosted on Vercel上不起作用。

一开始我以为是关于网络接入,加了0.0.0.0/0 on the IP Access List,没有区别。错误500只在生产中显示。

我从Formik的表单提交调用了nextjs的api。在控制台上,我还看到Error at onSubmit (test-2b8b0b9f0ee833a8.js:1:14850)

连接和断开的代码

import mongoose from 'mongoose';
const connection = {};
async function connect() {
if (connection.isConnected) {
console.log('already connected');
return;
}
if (mongoose.connections.length > 0) {
connection.isConnected = mongoose.connections[0].readyState;
if (connection.isConnected === 1) {
console.log('use previous connection');
return;
}
await mongoose.disconnect();
}
const db = mongoose.connect(process.env.MONGODB_URI);
console.log('new connection');
connection.isConnected = db.connections[0].readyState;
}
async function disconnect() {
if (connection.isConnected) {
if (process.env.NODE_ENV === 'production') {
await mongoose.disconnect();
connection.isConnected = false;
} else {
console.log('not disconnected');
}
}
}
function convertDocToObj(doc) {
doc._id = doc._id.toString();
doc.createdAt = doc.createdAt.toString();
doc.updatedAt = doc.updatedAt.toString();
return doc;
}
const db = { connect, disconnect, convertDocToObj };
export default db;

人模型
import mongoose from 'mongoose';
const PersonSchema = new mongoose.Schema(
{
name: { type: String, required: true },
count: { type: Number, required: false },
},
{
timestamps: true,
}
);
const Person = mongoose.models.Person || mongoose.model('Person', PersonSchema);
export default Person;

页面/api/my-endpoint.js

import db from '../../../mongoose/db';
import Person from '../../../mongoose/models/Person';
const handler = async (req, res) => {
// the codes
await db.connect();
let person = await Person.findOne({
name: 'Frank',
});
person.count += 1;
await type.save();
await db.disconnect();
// the codes
}

我这样做的方式你也可以尝试或修改——

/lib/dbConnect.js

import mongoose from 'mongoose'
const DB_URL = process.env.DB_URL
if (!DB_URL) {
throw new Error(
'Please define the DB_URL environment variable inside .env.local'
)
}
/**
* Global is used here to maintain a cached connection across hot reloads
* in development. This prevents connections growing exponentially
* during API Route usage.
*/
let cached = global.mongoose
if (!cached) {
cached = global.mongoose = { conn: null, promise: null }
}
async function dbConnect() {
if (cached.conn) {
console.log("--- db connected ---");
return cached.conn
}
if (!cached.promise) {
const opts = {
bufferCommands: false,
}
cached.promise = mongoose.connect(DB_URL, opts).then((mongoose) => {
console.log("--- db connected ---")
return mongoose
})
}
cached.conn = await cached.promise
console.log("--- db connected ---")
return cached.conn
}
export default dbConnect;

/模型/videos.js

import mongoose from "mongoose";
let videoSchema = mongoose.Schema({
videoID: {
type: String,
},
authorID: {
type: String,
required: true,
},
authorName: {
type: String,
required: true,
},
videoURL: {
type: String,
required: true,
}
});
const Videos =mongoose.models?.videos || mongoose.model("videos", videoSchema);
export default Videos;

/页面/api/getVideos.js

import dbConnect from "../../lib/dbConnect";
import Videos from "../../models/videos";
export default async function handler(req,res){
try{
await dbConnect();
await Videos.find().lean().then(response=>{
return res.status(200).json(response);
});
}catch(e){
res.status(400).json(e);
}
}

//api调用方法

export const fetcher = (url,method,payload) => 
fetch(url,{
method:method,
headers:{
Accept:'application/json',
'Content-Type':"application/json"
},
body:JSON.stringify(payload)
}).then(res=>{
if(!res.ok){
const error = new Error("Error while fetching the data");
error.status = res.ok
error.message = 'error'
return error;
}else{
return res.json();
}
})

最新更新