【问题标题】:How to fetch data from an api handler from another api handler in Nextjs?如何从 Nextjs 中的另一个 api 处理程序的 api 处理程序中获取数据?
【发布时间】:2020-04-14 13:29:27
【问题描述】:

使用 Nextjs,我正在努力从另一个 API 处理程序中的 API 处理程序获取数据。 /api/batch.js 处理程序从 MongoDB 检索一些数据:

import middleware from '../../libs/mongodb';
import nextConnect from 'next-connect';

const handler = nextConnect();
handler.use(middleware);
handler.get(async (req, res) => {
  const {batch_uuid} = req.query
  const batch_stats = await req.db.collection('stats').find({
    'batch.uuid': uuid
  }).toArray()
  res.json(batch_stats)  
})
export default (req, res) => handler.apply(req, res)

/api/stats.js 处理程序从 MySQL 检索一些数据,并基于该数据和来自 Mongo 的数据构建有效负载。

stats.js 中的脏修复工作如下:

const response = await fetch('http://localhost:3000/api/batch?uuid=1234')
const data = await response.json()
// use data and build another payload

但是,这需要进行 http 调用,并且对于内部端点这样做没有意义。 我尝试直接调用batch 处理程序,但得到undefined

const getBatch = require('./batch');
module.exports = async (req, res) => {
   const accounts = await getBatch()
   res.status(200).json({accounts})
}

我错过了什么?

【问题讨论】:

    标签: node.js express next.js


    【解决方案1】:

    您可以从数据库中提取数据到一个单独的模块,然后在两个 API 处理程序中导入这个模块。 API 处理程序将只使用从 MongoDB 获取数据的同一模块,而不是一个 API 端点向另一个 API 端点发出请求。

    【讨论】:

    • 我实际上是这样做的,它只是更易读,因为数据库连接也是一个中间件,是req对象的一部分
    • @vicusbass,我遇到了类似的问题。我有用于 API 请求的 MongoDB 中间件。我也将与 DB 部分的连接提取到单独的模块中。简而言之,我的中间件看起来像 req.db = await mongo(); return handler(req, res);。因此,我可以在 API 处理程序中使用 MongoDB 连接作为中间件和应用程序的其他部分。
    • 你还有一个到 Mongo 的连接吗?
    • @vicusbass,是的,您甚至可以在不同的 API 请求之间共享单个连接。 MongoClient 类有一个函数 isConnected()。因此,您可以在建立新连接之前检查客户端是否已经连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2020-04-24
    • 2021-04-28
    • 2017-07-29
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多