【发布时间】:2021-08-03 11:38:47
【问题描述】:
我可以使用下面的代码和Metadata-scaper 在硬编码时成功地从 url 中检索元数据。但是我将如何允许用户使用文本输入输入链接并在表单提交时获取元数据?
我对将数据传递给 getStaticProps 感到困惑。非常感谢您的帮助。
import Head from 'next/head'
import { useState } from 'react';
import styles from '../styles/Home.module.css'
import getMetaData from 'metadata-scraper'
export async function getStaticProps(name) {
const url = "http://www.bbc.com"
const data = await getMetaData(url)
var urlData = JSON.stringify(data);
if (!urlData) {
return {
notFound: true,
}
}
return {
props: { urlData }, // will be passed to the page component as props
}
}
export default function Home(urlData) {
const [name, setName] = useState('');
const handleSubmit = e => {
e.preventDefault();
const data = {
name,
};
getStaticProps(name)
console.log(data);
};
const myData = JSON.parse(urlData.urlData)
return (
<div>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<form onSubmit={handleSubmit} className={styles.form}>
<label htmlFor="name">Name:</label>
<input
id="name"
type="text"
onChange={e => setName(e.target.value)}
/>
<button type="submit">Send</button>
</form>
</main>
{console.log(myData.title)}
<table>
<tr>
<th>title</th>
<th>Provider</th>
<th>Author</th>
<th>url</th>
<th>Language</th>
<th>Published</th>
</tr>
<tr>
<td>{myData.title}</td>
<td>{myData.provider}</td>
<td>{myData.author}</td>
<td>{myData.url}</td>
<td>{myData.language}</td>
<td>{myData.published}</td>
</tr>
</table>
</div>
);
}
2021 年 3 月 8 日更新 - 格林威治标准时间 15:35
我已经像这样将 API 路由分离到 api/meta.js,但是如何从那里传递表单中的链接?
import getMetaData from 'metadata-scraper'
export default async function handler(req, res) {
try {
const url = 'www.bbc.com'
res.statusCode = 200;
const data = await getMetaData(url)
res.end(JSON.stringify(data));
console.log(data)
}
catch (error) {
res.json(error);
res.status(405).end();
}
}
更新 index.js
import Head from 'next/head'
import { useState } from 'react';
import styles from '../styles/Home.module.css'
import useSWR from 'swr'
export default function Home() {
const { data } = useSWR('/api/meta', fetch)
const [name, setName] = useState('');
const handleSubmit = e => {
e.preventDefault();
fetch('/api/meta', {
method: 'post',
body: JSON.stringify({
name: name,
})
})
};
return (
<div>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<form onSubmit={handleSubmit} className={styles.form}>
<label htmlFor="name">Name:</label>
<input
id="name"
type="text"
onChange={e => setName(e.target.value)}
/>
<button type="submit">Send</button>
</form>
</main>
</div>
);
}
【问题讨论】:
标签: javascript reactjs next.js