NextJS/Vercel/MongoDB FetchError:对 http://localhost:3000/api/gear 的请求失败,原因:连接 ECONNREFUSED 127.0.0.1

Posted

技术标签:

【中文标题】NextJS/Vercel/MongoDB FetchError:对 http://localhost:3000/api/gear 的请求失败,原因:连接 ECONNREFUSED 127.0.0.1:3000【英文标题】:NextJS/Vercel/MongoDB FetchError: request to http://localhost:3000/api/gear failed, reason: connect ECONNREFUSED 127.0.0.1:3000 【发布时间】:2020-09-14 21:13:05 【问题描述】:

我使用 NextJS 对 MongoDB 进行 API 调用。当我转到 API link 时,我看到返回的 MongoDB 查询。但是,当我尝试将该数据提取到网页时,我收到 500 内部服务器错误。函数日志显示以下错误:

2020-05-27T17:17:02.129Z    5a0c88b0-da63-4225-acf1-ea1d589ff438    ERROR   FetchError: request to http://localhost:3000/api/gear failed, reason: connect ECONNREFUSED 127.0.0.1:3000
    at ClientRequest.<anonymous> (/var/task/node_modules/next/dist/compiled/node-fetch/index.js:1:147710)
    at ClientRequest.emit (events.js:310:20)
    at Socket.socketErrorListener (_http_client.js:426:9)
    at Socket.emit (events.js:310:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) 
  message: 'request to http://localhost:3000/api/gear failed, reason: connect ECONNREFUSED 127.0.0.1:3000',
  type: 'system',
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED'

所有代码在运行 npm run dev 时都可以在本地运行,只是在托管到 Vercel 时无法运行。我只是不太明白为什么当我导航到 API 页面时它会返回 MongoDB 数据,但是当我尝试从另一个页面调用该 API 时却无法连接。

作为参考,我使用了这个link 来构建我的数据库调用。

下面是失败页面的 getInitialProps 以及数据库中间件。

gear.jsx

import React,  Fragment  from "react"
import fetch from 'isomorphic-unfetch'

//Returned html here based on query. Left this part out to keep the issue simple.

export async function getServerSideProps() 
    const res = await fetch('http://localhost:3000/api/gear')
    const json = await res.json()
    return  props:  gearArray: json  


export default Gear;

api/gear.js

import nextConnect from 'next-connect';
import middleware from '../../middleware/database';

const handler = nextConnect();

handler.use(middleware);

handler.get(async (req, res) => 
    let gear = await req.db.collection('gear').find().sort(gear: 1).toArray();
    res.json(gear);
);

export default handler;

数据库.js

import  MongoClient  from 'mongodb';
import nextConnect from 'next-connect';

const client = new MongoClient(process.env.MONGOURL, 
  useNewUrlParser: true,
  useUnifiedTopology: true,
);

async function database(req, res, next) 
  if (!client.isConnected()) await client.connect();
  req.dbClient = client;
  req.db = client.db('BassTabs');
  return next();


const middleware = nextConnect();

middleware.use(database);

export default middleware;

【问题讨论】:

【参考方案1】:

在 Vercel 上托管您的应用程序时,您需要将您的获取 URL 更改为 https://my-bassist-chris.mybassistchris.now.sh/api/gear,因为这是数据的来源。

在本地运行您的应用程序时,您使用localhost

【讨论】:

伙计,我觉得自己像个傻瓜,这就是问题所在。感谢您的帮助!

以上是关于NextJS/Vercel/MongoDB FetchError:对 http://localhost:3000/api/gear 的请求失败,原因:连接 ECONNREFUSED 127.0.0.1的主要内容,如果未能解决你的问题,请参考以下文章

LPC2134单片机解密型号

基于FET3568-C核心板实现的智能网关

全自动荧光免疫分析仪系统是如何在FET4418-C核心板中实现的

基于FET335xD核心板-污染源在线监测解决方案

基于飞凌FET1052-C控制永磁同步交流伺服电机方案

Transphorm的SuperGaN第四代多千瓦级功率FET获得汽车级认证