Next Js API 在生产环境中无法访问

Nextjs API inaccessiable in production

我正在尝试托管一个 NextJS 应用程序,一切似乎都在本地运行良好。我可以从站点获取数据,也可以访问站点并查看返回的原始 json,但是当我尝试在生产环境中运行时,API 完全无法访问通过浏览器和 Axios 请求。

服务器只是 returns 500Internal Server Error.

我尝试在 DigitalOcean App Platform 和 AWS Amplify 上部署,但都无法连接到 API 路由。

我遵循了 this tutorial 的 NextJS SSR 方法,它说要构建并开始使用

// next.config.js

const path = require('path')
const Dotenv = require('dotenv-webpack')

require('dotenv').config()


module.exports = {
    webpack: (config) => {
        config.plugins = config.plugins || []
        config.module.rules.push({
            test: /\.svg$/,
            use: ["@svgr/webpack"]
        });
        config.plugins = [
            ...config.plugins,

            // Read the .env file                                                       
            new Dotenv({
                path: path.join(__dirname, '.env'),
                systemvars: true
            })
        ]

        return config
    },
    sassOptions: {
        includePaths: [path.join(__dirname, 'styles')]
    }
}
// package.json
...
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "digitalocean": "next start -H 0.0.0.0 -p ${PORT:-8080}",
    "start": "next start"
  },
...
// api.js
const axios = require('axios')
const {getS3URL} = require('./aws')

require('dotenv').config()


export default async (req, res) => {
  const config = {
    bucket: 'bucket',
    key: 'folder/data.json'
  }

  const request = await axios.get(await getS3URL(config));

  try {
    res.status(200).json(JSON.stringify(request.data))
  } catch {
    res.status(500).json({ error: '500', response })
    res.status(400).json({ error: '400', response })
  }
}

// frontend.js
...
  const getData = async () => {
    console.log(`${host}api/daily-trip-stats`)
    const trips = await axios.get(`${host}api/daily-trip-stats`)
    const routes = await axios.get(`${host}api/daily-route-stats`)
    const stops = await axios.get(`${host}api/daily-stops-routes`)

    const cleanUp = async (data) => {
      return await data.map(fea => fea.properties)
    }
    return {
      routes: await cleanUp(routes.data.features),
      trips: await cleanUp(trips.data.features),
      stops: await cleanUp(stops.data.features)
    }
  };
...

查看服务器日志,发现默认区域设置不正确。

var { S3Client, GetObjectCommand, Config} = require('@aws-sdk/client-s3');
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const getS3URL = async ({bucket, key}) => {
    const client = new S3Client({
      region: 'us-east-1' // !!! FORGOT TO SET THE DEFAULT REGION
    })
  
    var params = {
      Bucket: bucket,
      Key: key,
      Expires: 60,
      ContentType: 'blob'
    };
    const s3Data = new GetObjectCommand(params);
    const url = await getSignedUrl(client, s3Data, { expiresIn: 3600 });
    return url
  };

module.exports = {getS3URL}