在我的Remix应用程序中,这也是一个Shopify应用程序,我正在使用加载器函数中的pg
节点模块进行PostgreSQL查询。服务器成功执行查询并从数据库获得响应。但是,客户端抛出process is not defined
错误。这是由下面的源代码中概述的pg
节点模块引起的。
据我所知,服务器端模块不应该让他们的方式向客户端?
查看客户端源代码突出显示了它尝试访问user: process.platform === "win32" ? process.env.USERNAME : process.env.USER
行上的process.env.USERNAME
时的错误,如下所示。
// node_modules/.pnpm/[email protected]/node_modules/pg/lib/defaults.js
var require_defaults = __commonJS({
"node_modules/.pnpm/[email protected]/node_modules/pg/lib/defaults.js"(exports11, module2) {
"use strict";
module2.exports = {
// database host. defaults to localhost
host: "localhost",
// database user's name
user: process.platform === "win32" ? process.env.USERNAME : process.env.USER,
// rest of source...
我的代码:
// app._index.jsx
import { authenticate } from "../shopify.server";
import { useLoaderData } from "@remix-run/react";
import { json } from "@remix-run/node";
import ShopDAO from '~/dao/shopDAO';
export const loader = async ({ request }) => {
const auth = await authenticate.admin(request);
const shopName = auth.session.shop;
const data = await ShopDAO.read(shopName);
return json(data);
};
export default function Index() {
const data = useLoaderData();
console.log(data)
return (
<p>Index</p>
);
}
// shopDAO.js
import pool from "~/db/db";
class ShopDAO {
async read(shopName) {
const query = `
SELECT * FROM shop WHERE name = $1;
`;
try {
const { rows } = await pool.query(query, [shopName]);
return rows[0];
} catch (error) {
console.error(`Could not read shop: ${error}`);
throw error;
}
}
}
export default new ShopDAO;
我已经尝试从客户端删除useLoaderData()
钩子(出于兴趣),它仍然导致相同的错误。
显然,客户端不应该接收服务器端代码。所以我要么做错了什么,要么可能做错了什么。我就是想不通。
1条答案
按热度按时间ntjbwcob1#
是的,Remix确实会尝试从客户端包中分离出任何服务器代码。然而,根据代码的不同,它可能并不总是能够自动完成。
看着你的代码,我有一种感觉,这是由于:
将文件名更改为
db.server.js
,Remix将确保任何导出都只在服务器端进行。