Прямой импорт next.js Конечная точка API в getServerSideProps()

#reactjs #next.js

#reactjs #next.js

Вопрос:

При извлечении данных с помощью getServerSideProps() в Next.js они рекомендуют напрямую импортировать конечную точку API вместо использования fetch() и запуска другого HTTP-запроса. Это имеет смысл, и я смог заставить его работать, пока не было реализовано промежуточное программное обеспечение для моего API (обратите внимание, я использую функцию API, встроенную в Next.js ). Теперь, когда реализовано промежуточное программное обеспечение, я не могу экспортировать функции, использующие промежуточное программное обеспечение, я должен экспортировать обработчик. Смотрите ниже:

 const handler = nextConnect();
handler.use(middleware);

handler.get(async (req, res) => {
    const post = await req.db.collection("posts").findOne();
    res.send({
        post: post,
    });
});

export default handler;
  

Какой рекомендуемый способ импортировать конечную точку моего API в getServerSideProps? Я хотел бы сделать что-то следующим образом, но getPost() функция больше не имеет доступа к промежуточному программному обеспечению базы данных:

 export const getPost = async () => {
    const post = await req.db.collection("posts").findOne();
    return post;
}

handler.get(async (req, res) => {
    res.send({
        post: getPost(),
    });
});
  

а затем в моем next.js страница:

 import { getPost } from './api/post';
...
export async function getServerSideProps(context) {
    return {
        props: {
            post: getPost(),
        }
    }
}
  

Комментарии:

1. Если вы дадите мне больше информации о настройке вашего проекта, в частности вашей базы данных, я могу полностью решить проблему за вас и заработать эту награду 😉

Ответ №1:

В любом случае вам придется передать объекты req и res функции. Но если вы сделаете следующее, post prop должен быть заполнен NextApiResponse экземпляром, который в своей основе является stream.Writable объектом, что, вероятно, не то, что вы хотите…

 import { getPost } from './api/post';
...
export async function getServerSideProps({req, res}) {
  return {
    props: {
      post: await getPost(req, res),
    }
  }
}
  

Вы могли бы попытаться прочитать поток, но это кажется более сложным, чем рефакторинг вашего кода, но если вы вызовете getPost(req, res).end() , я думаю, вы должны получить потоковые данные, но я не уверен, как они будут отформатированы. Вам нужно будет проверить.

Вы могли бы немного больше разделить свои функции..

 // In your api endpoint:
const handler = nextConnect();
handler.use(middleware);

export async function getPostMethod(db) {
  return await db.collection("posts").findOne();
}

handler.get(async (req, res) => {
  res.send({
    post: await getPostMethod(req, res, req.db)
  })
});

export default handler;

// In your page component:

export async function getServerSideProps({req, res}) {
  // Do what ever you have to do here to get your database connection
  const db = await whereIsMyDb()
  return {
    props: {
      post: await getPostMethod(db),
    }
  }
}
  

Комментарии:

1. Спасибо за ответ, мне все еще немного неясно, как получить экземпляр db внутри getServerSideProps(). У вас есть функция «whereIsMyDb», но при работе с промежуточным программным обеспечением, как эта функция будет возвращать экземпляр db?

2. Какую базу данных вы используете и как вы настроили ее в своем приложении?

3. Вопрос в том, зачем вам промежуточное программное обеспечение для подключения к вашей базе данных?