我有一个具有以下结构的基本 NodeJS 项目:
/configs
db.config.js
/routes
testRoutes.js
index.js
vercel.json
服务器所在的index.js如下所示:
const express = require('express');
const connectToDb = require('./configs/db.config');
const cors = require('cors');
const path = require('path');
const testRouter = require('./routes/testRoutes');
const app = express();
const PORT = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
app.use('/', express.static(path.join(__dirname, '/public')));
app.use('/test', testRouter.getUsers);
connectToDb()
.then((res) => {
app.listen(PORT, () => {
console.log(`Server is running on port: ${PORT}`);
});
})
.catch((err) => {
console.log(err);
});
module.exports = app;
db.config.js 连接到数据库一次并导出以在需要时使用:
const {MongoClient} = require('mongodb');
const uri = `mongodb+srv://${process.env.DB_USER}:` +
`${process.env.DB_PASSWORD}@${process.env.DB_CLUSTER_URL}/` +
`?retryWrites=true&w=majority&appName=${process.env.DB_APP_NAME}`;
const client = new MongoClient(uri);
let database;
const connectToDb = async () => {
if (database) {
return database;
}
try {
await client.connect();
console.log('Connected to MongoDB');
database = client.db(process.env.DB_NAME);
return database;
} catch (error) {
console.log(error);
}
};
module.exports = connectToDb;
除此之外,在服务器中我有一个
/test
路由,当访问该路由时,它会调用一个函数来从名为 users
的 mongo 数据库集合中检索所有记录:
const connectToDb = require('../configs/db.config');
const getUsers = async (req, res) => {
try {
let db = await connectToDb();
const collection = db.collection(process.env.DB_COLLECTION);
const data = await collection.find({}).toArray();
res.send(data);
} catch (error) {
console.error('Error accessing the database', error);
res.status(500).send('Failed to fetch data');
}
};
module.exports = {
getUsers,
};
当我在本地运行此命令时,转到
http:localhost:5000/test
后,数据库记录(因为现在只有一条)显示在窗口中,但是如果我在转到 /test
时将其部署到 Vercel 项目,则会出现网关超时:
我对使用 Vercel 相当陌生,但从日志中我似乎没有得到太多信息: 有人遇到过这个问题吗?如果有帮助,vercel.json 配置是这样的:
{
"version": 2,
"builds": [{
"src": "index.js",
"use": "@vercel/node"
}],
"routes": [{
"src": "/(.*)",
"dest": "index.js"
}]
}
我对 MongoDB 也不是那么了解,所以我不确定这是否可能是一个访问问题,即使它是 504 错误,但也许我缺少一些配置来允许对我部署的 Vercel 实例进行设置?如果您知道可能出了什么问题,请告诉我。
经过一番搜索,我发现我遇到的错误是因为需要与 Vercel 进行 MongoDB 集成,即通过以下链接:https://vercel.com/integrations/mongodbatlas 并按照步骤通过选择我的后端项目,我创建的 MongoDB 数据库,并且允许连接。虽然一开始它失败了,但这是因为经过一些重构后,我更改了分配集成的用户的密码。在 Vercel 应用程序的环境变量中相应地更改此变量就可以解决问题