#mongodb #npm #next.js #node-mongodb-native
#mongodb #npm #next.js #узел-mongodb-родной
Вопрос:
Мой проект (NextJS) работал нормально, и внезапно я столкнулся с проблемой ModuleNotFoundError
. Особенно в случае динамической маршрутизации NextJS.
Ошибка, которую я вижу, это: Module not found: Error: Can't resolve 'dns'
В pages
каталоге pages/programs/[programtype]/[program].jsx
при импорте mongo он выдает:
ModuleNotFoundError: Module not found: Error: Can't resolve 'dns' in 'node_modules/mongodb/lib'
Полный дамп ошибки:
ModuleNotFoundError: Module not found: Error: Can't resolve 'dns' in '/project-path/node_modules/mongodb/lib'
at /project-path/node_modules/webpack/lib/Compilation.js:925:10
at /project-path/node_modules/webpack/lib/NormalModuleFactory.js:401:22
at /project-path/node_modules/webpack/lib/NormalModuleFactory.js:130:21
at /project-path/node_modules/webpack/lib/NormalModuleFactory.js:224:22
at /project-path/node_modules/neo-async/async.js:2830:7
at /project-path/node_modules/neo-async/async.js:6877:13
at /project-path/node_modules/webpack/lib/NormalModuleFactory.js:214:25
at /project-path/node_modules/enhanced-resolve/lib/Resolver.js:213:14
at /project-path/node_modules/enhanced-resolve/lib/Resolver.js:285:5
at eval (eval at create (/project-path/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:13:1)
at /project-path/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:44:7
at /project-path/node_modules/enhanced-resolve/lib/Resolver.js:285:5
at eval (eval at create (/project-path/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:13:1)
at /project-path/node_modules/enhanced-resolve/lib/Resolver.js:285:5
at eval (eval at create (/project-path/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:25:1)
at /project-path/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js:67:43
Комментарии:
1. Пожалуйста, дайте нам код, в котором вы вызываете модуль «dns»
Ответ №1:
Проблема
Это тонкая проблема с серверным кодом в Next.js .
Ошибка очевидна — вы пытаетесь выполнить код на стороне сервера (запрос mongo) в коде на стороне клиента. Но причина не очевидна, потому что с Next.js вы должны иметь возможность вызывать Mongo из своих компонентов.
Причина
Next.js выдает эту ошибку, потому что вы импортируете свой код mongo, не используя его.
Звучит странно, но это правда.
Как этого избежать
Чтобы избежать этой ошибки, просто удалите любой серверный код import
в своих компонентах, если вы его не используете getServerSideProps
.
Это звучит еще более странно, но это правда.
Хорошие и плохие примеры
Это работает нормально:
import { findUsers } from '../lib/queries'
function Home({ users }) {
return (
<h1>Users list</h1>
//users.map and so on...
)
}
export async function getServerSideProps() {
const users = await findUsers()
return {
props: {
users: users
}
}
}
export default Home
В то время как это приведет к ошибке:
import { findUsers } from '../lib/queries'
function Home({ users }) {
return (
<h1>Users list</h1>
//users.map and so on...
)
}
export async function getServerSideProps() {
// call disabled to show the error
// const users = await findUsers()
return {
props: {
users: [] //returning an empty array to avoid other errors
}
}
}
export default Home
Комментарии:
1. Я был укушен этим пару раз. Сообщения об ошибках вообще не помогают.
2. Не Mongo, но у меня была аналогичная проблема, которая была решена аналогичным образом.
3. Моя проблема заключалась в том, что я вызывал
getServerSideProps()
getServerSiderProps()
… несколько дней, ха-ха
Ответ №2:
Храните свои модули кодирования на стороне сервера (например, модели, создатель подключения к базе данных) за пределами каталога страниц.
Для справки: https://nextjs.org/docs/messages/prerender-error
Комментарии:
1. У меня был мой класс mongodb внутри папки utils рядом с папкой pages, но я все равно получил эту ошибку. Удаление импорта для материала mongodb в index.js помогло
2. Ваше решение сработало для меня. У меня была моя
lib
папка внутриpages
папки. В моейlib
папке был код dbconnection.
Ответ №3:
Если вы получаете эту ошибку при авторизации Next-js, убедитесь, что ваша папка «lib» находится в корневом каталоге.
Ответ №4:
моя проблема заключалась в том, что я использовал функцию в initialprops, которая была экспортирована через module.exports вместо экспорта по умолчанию
Ответ №5:
Я создал каталог с именем «api-lib» в корневом каталоге моего проекта, чтобы добавить мои запросы, и это вызвало появление этой ошибки. И я решил это, переместив мой каталог «api-lib» в основной каталог «src».
Ответ №6:
Моя проблема заключалась в экспорте getServerSideProps
со всеми операциями на стороне сервера из компонента, где он должен быть размещен и экспортирован только из компонента СТРАНИЦЫ.
Перемещение getServerSideProps в компонент главной страницы и просто детализация того, что мне нужно, в дочернем компоненте, решило это для меня.