利用ChatGPT实现一个Node.js API
在工作被AI替代前先让AI帮你工作吧
2023年3月5日
本文共有2042字,预计阅读时间10分钟
初步思路
useEffect
将数据渲染到界面上就可以了。尝试
exifr
的parse()
方法:1const res = await fetch(url);
2const blob = await res.blob();
3const rawData = (await exifr.parse(blob)) || {};
跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。
localhost
向OSS域名发起了一个GET请求,被浏览器阻止了。要想解决这个问题,可以在OSS那边进行配置,允许外部域名发来这样的请求。Access-Control-Allow-Origin
,页面终于如我所愿,获取到了EXIF信息并渲染到界面上。土豪行为
next/image
来进行压缩优化,实际中并没有直接从OSS下载图片,而是由服务器下载经过压缩后返回给浏览器。这样能减小图片体积提升加载速度。ChatGPT给的灵感
- 我的服务器流量很大,基本不用担心流量耗尽;
- 查询的结果可以缓存,实际上真正的流量并不会那么大。
第一个Node.js程序
1const express = require("express");
2const app = express();
3const port = 1216;
4
5app.get("/exif", async (req, res) => {
6 //在这里执行查询
7});
8
9app.listen(port, () => console.log(`Exif查询接口正在运行 ${port}!`));
1const exifr = require("exifr");
2const axios = require("axios");
3
4async function getExif(url) {
5 try {
6 const response = await axios.get(url, { responseType: "arraybuffer" });
7 const rawData = await exifr.parse(response.data);
8 exif.Maker = rawData.Make || "unknown";
9 exif.Model = rawData.Model || "unknown";
10 exif.ExposureTime = formatShutterTime(rawData.ExposureTime) || "unknown";
11 exif.FNumber = rawData.FNumber || "unknown";
12 exif.iso = rawData.ISO || "unknown";
13 exif.FocalLength = rawData.FocalLength || "unknown";
14 exif.LensModel = rawData.LensModel || "unknown";
15 return exif;
16 } catch (err) {
17 throw err;
18 }
19}
formatShutterTime()
是一个把获取到的原始快门数据(0.0001)转换成摄影师更熟悉的格式的函数:1function formatShutterTime(shutterTime) {
2 if (!shutterTime) return "0";
3 const time = parseFloat(shutterTime);
4 if (time >= 1) {
5 return time.toFixed(2);
6 }
7 const fraction = Math.round(1 / time);
8 return `1/${fraction}`;
9}
1const exifr = require("exifr");
2const axios = require("axios");
3
4const GPS = {};
5
6async function getGPS(url) {
7 try {
8 const response = await axios.get(url, { responseType: "arraybuffer" });
9 const rawData = await exifr.parse(response.data);
10 GPS.latitude = rawData.latitude || 0;
11 GPS.longitude = rawData.longitude || 0;
12 return GPS;
13 } catch (err) {
14 throw err;
15 }
16}
17
18module.exports = getGPS;
1app.get("/exif", async (req, res) => {
2 const url = req.query.url;
3 const cacheKey = `exif:${url}`;
4 let exifData = cache.get(cacheKey);
5
6 if (!exifData) {
7 try {
8 exifData = await getExif(url);
9 } catch (err) {
10 return res.status(500).send(err.message);
11 }
12 cache.set(cacheKey, exifData, 3600);
13 res.json(exifData);
14 } else {
15 res.json(exifData);
16 }
17
18});
效果
1{
2 "Maker":"SONY",
3 "Model":"ILCE-7M4",
4 "ExposureTime":"1/1250",
5 "FNumber":4,
6 "iso":100,
7 "FocalLength":61,
8 "LensModel":"FE 24-105mm F4 G OSS"
9}
useEffect()
显示到界面上就可以了。