我正在使用node.js和用于SSR的next.js框架以及firebase / firestore作为数据库来构建一个电子商务网站。
我已经成功地使网站从显示所有可用产品的视图中获取数据并从firestore中显示数据。现在,我希望能够单击某个产品,并转到一个单独的产品页面,其中显示该产品的额外信息和选项。我使用已分配产品的唯一SKU编号作为参考,以从Firestore获取正确的数据。
但是,当单击该项目并重定向到该页面时,我不断收到错误信息,即stringSKU不是有效的第三个参数。刷新页面后,即可获得预期的输出。
我已经使用了'await'以便在承诺发生之前获取stringSKU,并在承诺发生之前登录控制台以提供正确的值。这是我的代码。
export default class Product extends React.Component {
static async getInitialProps(context) {
const obj = await context.query;
const stringSKU = await obj.SKU
//Displays the correct string value
console.log(stringSKU)
let firebase= await loadFirebase()
let result = await new Promise((resolve, reject) =>
{
//this is where the error occurs
firebase.firestore().collection('products')
.where('SKU','==',stringSKU)
.get()
.then((snapshot) =>{
let data = []
snapshot.forEach((doc) => {data.push(Object.assign({id: doc.id }, doc.data())) })
resolve(data)
})
.catch(error => {
reject([])
})
})
return {products: result}
}
此外,由于我仅尝试从Firebase中检索一项,因此,我觉得使用forEach并将该项放入数组不是最好的方法,也不是使用SKU来检索文档。
关于如何通过仅将返回的对象分配给单个变量并使用自动分配的Firestore ID来改进此代码的任何建议都将非常有用!抱歉,我是javascript / node.js n00b:)