在组件中获取 Next.js API

凯瑟琳娜·施瑞伯

我是 Next.js 的新手,我正在为 API 路由而苦苦挣扎,或者确切地说,如何从这些路由中获取数据。我已经在 /api/weather.js 中编写了我的无服务器函数

export default async function handler(req, res) {
const city = req.query.city;
const getWeatherData = await fetch(
    `https://api.weatherapi.com/v1/search.json?key=${process.env.WEATHER_API_KEY}&q=${city}&days=5&aqi=no&alerts=no`
  );
  const data = await getWeatherData.json();
  res.status(200).json(data)
  console.log(city)
}

城市未定义,因为我希望通过组件 SearchBar.js 中的输入字段搜索城市。现在 http://localhost:3000/api/cities 只返回一个空数组,当然,因为我需要一个城市名称来获取城市。但是城市名称应该来自 SearchBar.js。然而我并没有走到那里。我有一个查询,但这与我的 API 没有任何关联。

export const SearchBar = () => {

const [query, setQuery] = useState('')
    const onChange = (e) => {
      const {value} = e.target;
      setQuery(value)
      

      let matchingCities = []

      if(value.length > 3) {
        const test = fetch('/api/cities', {
          method: 'GET'
        }).then((response) => response.json())
        console.log(test)
        //test returns a promise pending
      }
    }

  return(
    <div className="sm:col-span-2">
      <label htmlFor="email" className="block text-sm font-medium text-gray-700">
        Search city
      </label>
      <div className="mt-1">
        <input
          onChange={onChange}
          id="city"
          name="city"
          type="text"
          value={query}
          autoComplete="city"
          className="py-3 px-4 block w-full shadow-sm focus:ring-blue-500 focus:border-blue-500 border-gray-300 rounded-md"
        />
      </div>
    </div>
  )
}

我知道这可能太复杂了,但也许有人至少可以描述必要的步骤,将这些步骤连接起来,让这个查询在我输入的城市中工作。

亚历克斯 A.

一般来说,步骤是:

  • 您在浏览器页面中的搜索栏将带有城市名称的请求发送到服务器上您自己的 API 端点
  • 您的 API 函数采用城市名称,并将请求发送给天气提供商(使用密钥)
  • 当它得到响应时,它响应原始请求,转发数据
  • 您的浏览器接收响应并对其进行一些有用的操作

需要解决的几件事:

  • 端点的名称:您有/api/weather.js,因此在 SearchBar 中您应该调用/api/weather,而不是/api/cities
  • 您的 api 需要city参数,因此您需要将输入中的值传递给它:/api/weather?city=${value}
  • 也许使用await而不是.then,使它更容易阅读(但这是可选的)

请参阅此处的工作示例(检查控制台以获取输出):https : //codesandbox.io/s/next-js-api-with-lewagon-autocomplete-xrb3l?file=/components/SearchBar.jsx

我使用 LeWagon 的 API 而不是天气服务,它不需要密钥 :)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在next.js getInitialProps中调用Prismic API?

如何在Storybook中模拟next.js图像组件?

Next.js。如何在布局中调用组件的getInitialProps

如何从Next.js中的Formik Submit返回API(获取的)数据

将组件放置在我的next.js文件中的位置

在next.js中创建上传文件api

Next.js在嵌套子组件中获取数据

在Next.js中获取数据

在组件内部获取Next.js数据的最佳实践

如何在Next.JS + Rails API后端中存储用户信息?

为什么在使用硬编码的api-key的next.js中获取数据但不能使用环境变量来获取数据?

在Next.js中获取非API数据的最佳实践是什么(通过Vercel部署)

如何在Next.js中进行依赖获取API调用

Next js中组件的条件渲染

如何保护Next.js中的API路由?

无法在 Next.js 中获取动态组件以跳过服务器端渲染并仅在客户端上显示

_app.js 类组件 Next.js 中的上下文 API 调度(消费者)

在 React.js 中获取 API 获取数据后加载组件

YouTube 视频 API 片段标题在 Next.js 中包含特殊字符

Next.js API 路由

Vue.js中组件显示时自动调用API获取带有prop值的数据

将 next.js 添加到组件库中以利用 Next.js 功能

如何在 Next.js 中创建组件?

Next.js API:使用 URL 中的查询参数的水印 PDF

如何从 Strapi API 引用 Next JS 中的图像组件?

如何在 Next.js 中创建 api 动态路由?

Next JS 通过 url 查询参数获取 API

如何使用 Next.js 和 Typescript 动态过滤在 API 中获取的帖子?

在 Next.js 的 API 中,没有为 send() \ json() 提供“body”的参数,使用 TypeScript