You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用node-postgres插入PostgreSQL数据时出现Illegal return语句错误

问题:node-postgres插入数据触发Illegal return statement错误

使用node-postgres操作PostgreSQL数据库时,查询数据可正常执行,但执行插入语句时触发语法错误。


相关代码

client.ts

import { Client } from 'pg'

const client = new Client({
  connectionString: "MY_DATABASE_URL",
  ssl: {
    rejectUnauthorized: false,
  },
});

export default client

提交处理函数

const submit = async (e: { preventDefault: () => void }) => {
    e.preventDefault()
  
    const query = `
      INSERT INTO mesin
          (nama_mesin, nomer_mesin, kategori, status_mesin)
      VALUES
          ('test2', 'test2', 'test2', 'test2')
    `

    try {
      const res = await client.query(query)
      console.log(res.rows[0])
    
    } catch (err: any) {
      console.log(err.stack)
    }
}

报错信息

- error SyntaxError: Illegal return statement
    at __webpack_require__ (user\.next\server\webpack-runtime.js:33:43)
    at __webpack_require__ (user\.next\server\webpack-runtime.js:33:43)
    at __webpack_require__ (user\.next\server\webpack-runtime.js:33:43)
    at __webpack_require__ (user\.next\server\webpack-runtime.js:33:43)
    at eval (./db/client.ts:5:60)
    at Module.(sc_client)/./db/client.ts (user\.next\server\app\mesin\page.js:663:1)
    at __webpack_require__ (user\.next\server\webpack-runtime.js:33:43)
    at eval (./app/mesin/page.tsx:16:68)
    at Module.(sc_client)/./app/mesin/page.tsx (user\.next\server\webpack-runtime.js:33:43)

解决方案

这个错误并非SQL语句问题,而是Next.js环境下代码运行环境不匹配导致:pg(node-postgres)是服务器端依赖,无法在浏览器客户端环境中运行。如果submit函数所在组件是客户端组件(添加了'use client'指令),直接导入并调用client.query会导致webpack打包时解析服务器端库代码失败,抛出语法错误。

修复步骤

方法1:使用Server Actions(推荐)

将数据库操作封装为Server Action,在服务器端执行:

  1. 创建Server Action(可单独放在actions.ts或组件文件中):
'use server'

import client from '@/db/client'

export async function addMesin() {
  const query = `
    INSERT INTO mesin
        (nama_mesin, nomer_mesin, kategori, status_mesin)
    VALUES
        ('test2', 'test2', 'test2', 'test2')
  `
  try {
    const res = await client.query(query)
    return res
  } catch (err) {
    console.error(err)
    throw err
  }
}
  1. 在客户端组件中调用该Action:
'use client'

import { addMesin } from './actions'

const submit = async (e: { preventDefault: () => void }) => {
  e.preventDefault()
  try {
    await addMesin()
    console.log('插入成功')
  } catch (err) {
    console.error(err)
  }
}

方法2:使用API路由

创建API路由处理插入请求,客户端通过fetch调用:

  1. 创建app/api/mesin/route.ts:
import client from '@/db/client'
import { NextResponse } from 'next/server'

export async function POST() {
  const query = `
    INSERT INTO mesin
        (nama_mesin, nomer_mesin, kategori, status_mesin)
    VALUES
        ('test2', 'test2', 'test2', 'test2')
  `
  try {
    await client.query(query)
    return NextResponse.json({ success: true })
  } catch (err) {
    console.error(err)
    return NextResponse.json({ success: false, error: '插入失败' }, { status: 500 })
  }
}
  1. 在客户端组件的submit函数中调用API:
'use client'

const submit = async (e: { preventDefault: () => void }) => {
  e.preventDefault()
  try {
    const res = await fetch('/api/mesin', { method: 'POST' })
    const data = await res.json()
    data.success ? console.log('插入成功') : console.error('插入失败')
  } catch (err) {
    console.error(err)
  }
}

注意:确保client.ts仅在服务器端代码中被导入,避免在客户端组件中直接引用。

内容的提问来源于stack exchange,提问作者Irfan Fauzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:20:30