在 Vite 中创建 api 调用(使用 ViteSSE / ViteSSE)

Posted

技术标签:

【中文标题】在 Vite 中创建 api 调用(使用 ViteSSE / ViteSSE)【英文标题】:Create api calls in Vite (with Vites-s-r / ViteSSG) 【发布时间】:2022-01-06 18:17:31 【问题描述】:

我目前正在使用 ViteJS 开发一个简单的电子商务网站。 我的项目使用:

Vue 3 Vite 2.4 vite-plugin-pages,用于自动生成路由(Nuxt 风格) vite-ssg,用于服务器端生成(SEO 优化)

托管是在免费的 netlify 帐户上完成的(如果需要,我愿意切换到 vercel 或其他帐户)。数据处理是通过 Headless CMS GraphCMS 完成的,托管在他们的服务器上。

按照Stipe integration with NextJS & GraphCMS 上的教程,我遇到了一个问题。在 NextJs 中,您可以在本地创建服务器端 api 路由,这与 Vite 不同。 由于 ViteSSG(服务器端生成)具有预渲染交付的 html 并在服务器端运行代码的能力,我想了解如何创建一个服务器路由来提供一个 api 而不必经历仅为简单调用创建和托管单独的后端:

POST https://localhost:3000/api/create-checkout-session

因为如果我在客户端(在 payBtn 点击处理程序内)创建条带结帐会话,则客户端可以更改数据(价格等...),因为处理程序代码将在客户端提供。我希望在服务器端生成此会话,并将其 Id 发送回客户端,然后在结帐过程中使用。它将删除更改数据的能力。

如果需要,我可以分享更多代码,如果不够清楚,我可以扩展信息。感谢您的帮助!

/* main.js */
import 'vue-global-api'
import  ViteSSG  from 'vite-ssg'
import generatedRoutes from 'virtual:generated-pages'
import  setupLayouts  from 'virtual:generated-layouts'
import App from './App.vue'

const routes = setupLayouts(generatedRoutes)

export const createApp = ViteSSG(
  App,
   routes ,
  (ctx) => 
    // install all modules under `modules/` folder (i18n, nprogress, pwa)
    Object.values(import.meta.globEager('./modules/*.js')).map(i => i.install?.(ctx))
  
)
/* Wanted API route */
import Stripe from 'stripe'
import  useAPI  from '@/utils/GraphCMS'

const graphcms = useAPI()
const stripe = new Stripe(/* STIPE API KEY*/)

export default (req, res) => 
  const  slug  = req.body
  // fetch product from GraphCMS
  const result = await graphcms.getSingleProduct(slug)

  try 
    const session = stripe.checkout.sessions.create(
      success_url: 'http://localhost:3000/?id=CHECKOUT_SESSION_ID',
      cancel_url: `http://localhost:3000/services/$slug`,
      /*...*/
    )
    res.json(session)
   catch(e) 
    res.json( error: message: e )
  

  return

<!-- Client Side API Call -->
<script setup>
...
/* goPay, called on button click => Should POST data to server-side API route */
const goPay = async (e) => 
    e.preventDefault()
    // Create checkout session
    const session = await fetch('/api/create-checkout-session', 
      method: 'POST',
      headers: 
        'Content-Type': 'application/json'
      ,
      body: JSON.stringify(
        slug: service.slug
      )
    )

    // redirect to checkout
  
</script>

<template>
  <PayBtn @click="goPay" />
</template>

【问题讨论】:

【参考方案1】:

在 NextJs 中,您可以本地创建服务器端 api 路由

是的,因为它有一个在 Node 上运行的服务器组件(所以你需要一个 Node 服务器来运行 Next/Nuxt 站点......除非使用“生成”模式)

由于 ViteSSG(服务器端生成)具有预渲染交付的 html 的能力

是的,在构建期间

在服务器端运行代码

我不知道你为什么这么想,但我真的很怀疑。 vite-ssg 仅在构建时运行。它没有在运行时需要甚至可用的服务器组件(在为您的预渲染页面提供服务时)

Vite 本身只是开发工具。同样,Vite 的“服务器”组件仅用于在开发过程中为资源提供服务。有一些插件可以让您简化服务器端路由的创建,如 vite-plugin-mix 或 fastify-vite,但两者都只是为您生成服务器端代码包,您需要设置 Node 服务器以实际运行 API

但您确实需要一些服务器功能 - Stripe 文档在这方面非常清楚。但是您不需要独立服务器(需要设置并 24/7 运行)。您可以尝试的称为“无服务器计算”。大多数托管服务提供商都有类似的东西,包括 Netlify - Netlify functions

我没有直接的经验,但是如果你 google a bit 你可以找到一个 examples 关于如何将它与 Vite 集成(使用代理)

【讨论】:

以上是关于在 Vite 中创建 api 调用(使用 ViteSSE / ViteSSE)的主要内容,如果未能解决你的问题,请参考以下文章

vite 使用 process.env的问题

vue3+vite中使用环境变量 .env 的一些配置情况说明

vite+mockjs+vite-plugin-mock 搭建mock环境

Vue3+Vite4+Naive-UI 项目自动导入API和组件

Vite快速使用

Vite HMR API