Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在getServerSideProps()中直接导入next.js API端点_Reactjs_Next.js - Fatal编程技术网

Reactjs 在getServerSideProps()中直接导入next.js API端点

Reactjs 在getServerSideProps()中直接导入next.js API端点,reactjs,next.js,Reactjs,Next.js,在Next.js中使用getServerSideProps()获取数据时,他们建议直接导入API端点,而不是使用fetch()并运行另一个HTTP请求。这是有道理的,在为我的API实现中间件之前,我一直能够让它工作(注意,我使用的是Next.js中内置的API特性)。现在实现了中间件,我不能导出使用中间件的函数,我必须导出处理程序。见下文: const handler = nextConnect(); handler.use(middleware); handler.get(async (re

在Next.js中使用
getServerSideProps()
获取数据时,他们建议直接导入API端点,而不是使用
fetch()
并运行另一个HTTP请求。这是有道理的,在为我的API实现中间件之前,我一直能够让它工作(注意,我使用的是Next.js中内置的API特性)。现在实现了中间件,我不能导出使用中间件的函数,我必须导出处理程序。见下文:

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(),
    });
});
然后在我的下一个.js页面:

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

在任何情况下,都必须将
req
res
对象传递给函数。但是如果您执行以下操作,那么
post
道具应该填充一个
nextapireresponse
实例,它的基础是一个
流。可写的
对象,这可能不是您想要的

从'/api/post'导入{getPost};
...
导出异步函数getServerSideProps({req,res}){
返回{
道具:{
post:等待getPost(请求、回复),
}
}
}
您可以尝试读取流,但这似乎比重构代码更麻烦,但是如果调用
getPost(req,res).end()
,我认为您应该获取流数据,但我不确定它将如何格式化。你得检查一下

你可以把你的函数再拆分一点

//在api端点中:
const handler=nextConnect();
使用(中间件);
导出异步函数getPostMethod(db){
return wait db.collection(“posts”).findOne();
}
handler.get(异步(req,res)=>{
res.send({
post:等待getPostMethod(req、res、req.db)
})
});
导出默认处理程序;
//在页面组件中:
导出异步函数getServerSideProps({req,res}){
//在这里,您需要做什么才能获得数据库连接
const db=wait whereIsMyDb()
返回{
道具:{
post:等待getPostMethod(db),
}
}
}

感谢您的回复,我仍然不清楚如何在getServerSideProps()中获取db实例。你有“whereIsMyDb”功能,但在处理中间件时,该功能如何返回db实例?你使用的是哪个数据库,你在应用程序中是如何配置的?问题是:为什么你需要中间件连接到你的数据库?如果你给我更多关于项目设置的信息,特别是你的数据库,我完全可以帮你解决这个问题,并获得赏金;)