我希望在我的NextJS应用程序中展示谷歌地图照片。要获取这些图片的特定URL,需要API密钥,但同时我不想将这个API密钥公开。
我的目标是实现一个NextJS API路由,从谷歌地图照片中获取并返回指定的图片,同时也能够直接从图像标签访问,如下所示:
然而,这个方法也行不通,因为 res 是一个 NextApiResponse 而不是 WritableStream。虽然我在网上搜索过,但我没有找到如何像写入 WritableStreams 那样写入 NextApiResponse 的方法。
最后,我尝试手动将响应转换为缓冲区,并将其写入 NextApiResponse:
我的目标是实现一个NextJS API路由,从谷歌地图照片中获取并返回指定的图片,同时也能够直接从图像标签访问,如下所示:
<img src={`/api/photos/${place?.photos[0].photo_reference}`} alt='' />
我在网上找到了一些不同的来源,建议将来自Google请求的响应流直接传输到输出响应的响应流中:
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
const response = await fetch(
`https://maps.googleapis.com/maps/api/place/photo
&photo_reference=${id}
&key=${process.env.GOOGLE_PLACE_API_KEY}`,
);
if (!response.ok) {
console.log(response);
res.status(500).end();
return;
}
response.body.pipe(res);
}
然而,由于response.body是ReadableStream类型的,它不具备.pipe()方法。相反地,它具有.pipeTo()和.pipeThrough()方法。
后来我尝试过
response.body.pipeTo(res);
然而,这个方法也行不通,因为 res 是一个 NextApiResponse 而不是 WritableStream。虽然我在网上搜索过,但我没有找到如何像写入 WritableStreams 那样写入 NextApiResponse 的方法。
最后,我尝试手动将响应转换为缓冲区,并将其写入 NextApiResponse:
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
const response = await fetch(
`https://maps.googleapis.com/maps/api/place/photo
&photo_reference=${id}
&key=${process.env.GOOGLE_PLACE_API_KEY}`,
);
if (!response.ok) {
console.log(response);
res.status(500).end();
return;
}
const resBlob = await response.blob();
const resBufferArray = await resBlob.arrayBuffer();
const resBuffer = Buffer.from(resBufferArray);
const fileType = await fileTypeFromBuffer(resBuffer);
res.setHeader('Content-Type', fileType?.mime ?? 'application/octet-stream');
res.setHeader('Content-Length', resBuffer.length);
res.write(resBuffer, 'binary');
res.end();
}
虽然这样完成了响应,但是没有显示图片。
我如何直接将从服务器检索到的谷歌地点图像传递给前端,以便可以由 <img> 标签使用?