When deploying my express/mongoDB app to netlify I keep running in the error ModuleNotFoundError: Module not found: Error: Can't resolve 'mongodb-client-encryption' in '/opt/build/repo/node_modules/mongodb/lib'
this runs fine locally when running ‘yarn start’ but ‘yarn build’ I get the same error above.
url:
https://pedantic-hermann-961116.netlify.app/
Directory Setup:
config/Db.js:
const mongoose = require('mongoose');
const config = require('config');
const db = config.get('mongoURI');
const connectDB = async () => {
try {
await mongoose.connect(db, {
useNewUrlParser: true
});
console.log('MongoDB Connected...');
} catch (err) {
console.error(err.message);
process.exit(1);
}
};
module.exports = connectDB;
config/default.js:
{
"mongoURI": "mongodb+srv://User:Pass@cluster0.eqzjk3.mongodb.net/myFirstDatabase?retryWrites=true&w=majority",
"baseUrl": "http://localhost:5000"
}
models/Url.js
const mongoose = require('mongoose');
const urlSchema = new mongoose.Schema({
urlCode: String,
longUrl: String,
shortUrl: String,
date: { type: String, default: Date.now }
});
module.exports = mongoose.model('Url', urlSchema);
src.js:
const express = require("express");
const serverless = require("serverless-http");
const connectDB = require('../config/db');
const Url = require('../models/Url');
const validUrl = require('valid-url');
const shortid = require('shortid');
const config = require('config');
const app = express();
const router = express.Router();
// Connect to database
connectDB();
router.get('/:code', async (req, res) => {
try {
const url = await Url.findOne({ urlCode: req.params.code });
if (url) {
return res.redirect(url.longUrl);
} else {
return res.status(404).json('No url found');
}
} catch (err) {
console.error(err);
res.status(500).json('Server error');
}
});
router.post('/shorten', async (req, res) => {
const { longUrl } = req.body;
const baseUrl = config.get('baseUrl');
// Check base url
if (!validUrl.isUri(baseUrl)) {
return res.status(401).json('Invalid base url');
}
// Create url code
const urlCode = shortid.generate();
// Check long url
if (validUrl.isUri(longUrl)) {
try {
let url = await Url.findOne({ longUrl });
if (url) {
res.json(url);
} else {
const shortUrl = baseUrl + '/' + urlCode;
url = new Url({
longUrl,
shortUrl,
urlCode,
date: new Date()
});
await url.save();
res.json(url);
}
} catch (err) {
console.error(err);
res.status(500).json('Server error');
}
} else {
res.status(401).json('Invalid long url');
}
});
app.use(express.json());
// Define Routes
app.use('/', router);
app.use('/api/url', router);
const PORT = 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
module.exports = app;
module.exports.handler = serverless(app);
netlify.toml:
[build]
functions = "functions"
[dev]
publish = "dist"