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

问题描述 投票:0回答:1

我使用NextJS对MongoDB进行API调用。当我转到API链接https://my-bassist-chris.mybassistchris.now.sh/api/gear时,我看到返回了MongoDB查询。但是,当我尝试将数据获取到网页时,出现500 Internal Server Error。功能日志显示以下错误:

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时却无法连接。

供参考,我使用此链接来构造数据库调用:https://developer.mongodb.com/how-to/nextjs-building-modern-applications

以下是失败页面的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;

database.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;
node.js mongodb next.js vercel
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.