mongodb 如何在NextJS的getServerSideProps中传递数据库数据作为属性

fivyi3re  于 2023-03-01  发布在  Go
关注(0)|答案(2)|浏览(106)

我想将使用用户id从MongoDB数据库中获取的用户数据传递给return部分中的props。如何将回调函数中的数据docs正确地发送到props
感谢您的回复。

export const getServerSideProps = async (userid) => {
  await connectMongo();
  console.log("db connected on profile page");

  User.findOne({ id: userid }, function (err, docs) {
    if (err) {
      console.log(err);
    } else {
      console.log(docs.email);
    }
  });
  return {
    props: {

    },
  };

};
a1o7rhls

a1o7rhls1#

我也在前端使用了MongoDB,我添加了一个片段来给予一个完整的示例。然而,简单地说,您需要将DB find请求的结果存储在一个变量中,如果您只是使用findOne()进行搜索或寻找一个结果我建议将find结果存储在一个变量中,并将其作为一个属性直接发送到页面。
但是,如果db.collection("submissions").find()请求有多个结果,则需要调用JSON.parse(JSON.stringify(results))

客户端/页面/...

export async function getServerSideProps({req}) {
  let env = process.env.NODE_ENV === "development" ? "-dev" : "";

  const client = await clientPromise;
  const db = client.db('FormSubmissions' + env);
  const forwarded = req.headers['x-forwarded-for'];

  const ipAddress = typeof forwarded === 'string' ? forwarded.split(/, /)[0] : req.socket.remoteAddress;

  let _submissionsByIP = await db.collection("submissions").find({
    ipAddress: ipAddress,
  })

  let submissionsByIP = await _submissionsByIP.toArray();
  console.log('submissionsByIP',submissionsByIP);

  return {
    props: {
      submissionsByIP: JSON.parse(JSON.stringify(submissionsByIP)),
    },
  };
}

function Support_Sales({submissionsByIP}) {
...
}

客户承诺

import { MongoClient } from 'mongodb'

const uri = process.env.MONGODB_URI
const options = {
  useUnifiedTopology: true,
  useNewUrlParser: true,
}

let client
let clientPromise

if (!process.env.MONGODB_URI) {
  throw new Error('Invalid/Missing environment variable: "MONGODB_URI" - Add Mongo URI to .env.local')
}

if (process.env.NODE_ENV === 'development') {
  if (!global._mongoClientPromise) {
    client = new MongoClient(uri, options)
    global._mongoClientPromise = client.connect()
  }
  clientPromise = global._mongoClientPromise
} else {
  client = new MongoClient(uri, options)
  clientPromise = client.connect()
}

export default clientPromise
gcuhipw9

gcuhipw92#

您可以创建一个新变量来解决该问题

let userData = {};
User.findOne({ id: userid }, function (err, docs) {
  if (err) {
    console.log(err);
  } else {
    console.log(docs.email);
    userData = docs
  }
});

return {
  props: {
    user: userData
  }
};

通过使用async,还有另一个解决方案。代码如下:

const userData = async User.findOne({ id: userid });

return {
  props: {
    user: userData
  }
};

相关问题