我将Nextjs应用程序部署到Vercel,尽管它在localhost上工作,但我的api调用失败,响应为500。我可以用getStaticProps
获得初始负载,所以我相信到DB的连接是可以的。
我的getStaticPaths
功能正常工作,看起来是这样的:
export async function getStaticProps() {
dbConnect();
const properties = await Property.find({
deletedAt: { $exists: false },
archivedAt: { $exists: false },
})
.sort({ refreshed: -1 })
.limit(itemsPerPage);
const propertiesCount = await Property.countDocuments(
{ deletedAt: { $exists: false }, archivedAt: { $exists: false } },
{ limit: 100 }
);
const pagesCount = Math.ceil(propertiesCount / itemsPerPage);
return {
props: {
fetchedProperties: properties.map((property) => propertyToJson(property)),
pagesCount: pagesCount,
},
revalidate: 5,
};
}
然而,当查询发生变化时,我调用useEffect
钩子,如下所示:
useEffect(() => {
if (Object.keys(query).length > 0) {
(async () => {
const filteredProperties = await fetch(
process.env.NEXT_PUBLIC_BASE_URL +
'/api/properties?' +
new URLSearchParams(query)
);
const res = await filteredProperties.json();
if (res.status === 200) {
setProperties(res.properties);
} else {
//show error
console.log('error');
}
})();
}
}, [query]);
并且这总是返回错误(在localhost上工作(。我的pages/api/properties/index.js
文件如下所示:
import dbConnect from 'utils/dbConnect';
import Property from 'models/Property';
import { propertyToJson } from 'utils/helpers';
const handler = async (req, res) => {
console.log('req:', req);
const { method } = req;
dbConnect();
if (method === 'GET') {
const { price } = req.query;
let queryCond = {};
if (price) {
queryCond.price = { $lte: price * 1 };
}
console.log('queryCond:', queryCond);
try {
const properties = await Property.find(queryCond).exec();
console.log('properties:', properties);
res.status(200).json({
status: 200,
properties: properties,
});
} catch (err) {
res.status(500).json(err);
}
}
};
export default handler;
此外,我在任何地方都无法从那个api文件中看到console.log
。不在Vercel功能日志中,运行vercel dev --debug
时不在我的终端中。我有一种感觉,请求甚至没有到达api/properties/index.js
文件。。。
如果你能帮我解决这个问题,我将不胜感激,但如果你能指出如何以有效的方式调试这些api文件,我将更加感激。谢谢
我想明白了。我的方法有两个问题:
- 我提供的代码片段只是更复杂代码的一部分。";POST";方法,我在问题中提交了该方法,并且导入了
import { adminAuth } from 'config/firebase-admin'
,其中env变量配置不正确。我认为这部分不应该是问题,因为我没有调用方法的这部分 - 当然,我甚至用问题中的代码进行了测试,但看起来,它可能缓存在我的浏览器中,并且反映了旧版本。对于Vercel上的每个构建,都会生成3个url,这可能是最好的URL,其中包括令牌,因此它对于构建是唯一的,您不可能看到缓存的旧代码