TypeError: 在 Next.js 和 Mongoose 应用程序中无法读取 null(读取 ‘get’)的属性。

huangapple go评论148阅读模式
英文:

TypeError: Cannot read properties of null (reading 'get') in Next.js and Mongoose application

问题

我正在使用 nextjsmongoose 和一个在 cookie 中使用的 jwt 令牌制作电子商务应用程序。

我遇到以下错误:TypeError: Cannot read properties of null (reading 'get')

models/order.js:

  1. import {model, models, Schema} from "mongoose";
  2. import mongoose from 'mongoose';
  3. const OrderSchema = new mongoose.Schema({
  4. products: {
  5. type: Object,
  6. required: true,
  7. },
  8. user_id: {
  9. type: mongoose.Schema.Types.ObjectId,
  10. ref: "User",
  11. },
  12. name: {
  13. type: String,
  14. required: true,
  15. },
  16. email: {
  17. type: String,
  18. required: true,
  19. },
  20. address: {
  21. type: String,
  22. required: true,
  23. },
  24. city: {
  25. type: String,
  26. required: true,
  27. },
  28. paid: {
  29. type: Number,
  30. default: 0
  31. },
  32. }, {timestamps: true});
  33. const Order = models?.Order || model('Order', OrderSchema)
  34. export default Order;

这个错误发生在我想要访问我的订单页面 (pages/orders.js) 时:

  1. import { useEffect, useState } from "react";
  2. import axios from "axios";
  3. import jwt from "jsonwebtoken";
  4. import cookie from "cookie";
  5. import Order from "../models/Order";
  6. function Orders() {
  7. const [orders, setOrders] = useState([]);
  8. useEffect(() => {
  9. async function fetchOrders() {
  10. const res = await axios.get("/api/secret");
  11. const secret = res.data.secret;
  12. // 从 cookie 中获取 JWT 令牌
  13. const token = cookie.parse(document.cookie).OursiteJWT;
  14. const decoded = jwt.verify(token, secret);
  15. const userId = decoded._id
  16. console.log(userId)
  17. // 从后端 API 获取用户的订单
  18. const response = await axios.get(`/api/orders?user_id=${userId}`);
  19. const orders = response.data;
  20. setOrders(orders);
  21. }
  22. fetchOrders();
  23. }, []);
  24. return (
  25. <div>
  26. {orders.map((order) => (
  27. <div key={order._id}>
  28. <h2>Commande {order._id}</h2>
  29. <p>Utilisateur: {order.name}</p>
  30. <p>Adresse: {order.address}</p>
  31. <p>Ville: {order.city}</p>
  32. <p>Produits:</p>
  33. <ul>
  34. {order.products.map((product) => (
  35. <li key={product._id}>{product.name}</li>
  36. ))}
  37. </ul>
  38. </div>
  39. ))}
  40. </div>
  41. );
  42. }
  43. export default Orders;

我注意到我不能在我的 useEffect 中或者在我的 useEffect 中的 API 调用中放置 console.log,因为我的 useEffect 甚至不运行,问题来自于我的模型。如果我删除我的 useEffect,我仍然会遇到相同的错误,所以问题并不是来自于我的 useEffect。

英文:

I'm making an ecommerce application with nextjs and mongoose and a jwt token in a cookie.

I have the following error : TypeError: Cannot read properties of null (reading &#39;get&#39;)
TypeError: 在 Next.js 和 Mongoose 应用程序中无法读取 null(读取 ‘get’)的属性。

models/order.js :

  1. import {model, models, Schema} from &quot;mongoose&quot;;
  2. import mongoose from &#39;mongoose&#39;;
  3. const OrderSchema = new mongoose.Schema({
  4. products: {
  5. type: Object,
  6. required: true,
  7. },
  8. user_id: {
  9. type: mongoose.Schema.Types.ObjectId,
  10. ref: &quot;User&quot;,
  11. },
  12. name: {
  13. type: String,
  14. required: true,
  15. },
  16. email: {
  17. type: String,
  18. required: true,
  19. },
  20. address: {
  21. type: String,
  22. required: true,
  23. },
  24. city: {
  25. type: String,
  26. required: true,
  27. },
  28. paid: {
  29. type: Number,
  30. default: 0
  31. },
  32. }, {timestamps: true});
  33. const Order = models?.Order || model(&#39;Order&#39;, OrderSchema)
  34. export default Order;

This error comes when I want to access my orders page (pages/orders.js) :

  1. import { useEffect, useState } from &quot;react&quot;;
  2. import axios from &quot;axios&quot;;
  3. import jwt from &quot;jsonwebtoken&quot;;
  4. import cookie from &quot;cookie&quot;;
  5. import Order from &quot;../models/Order&quot;;
  6. function Orders() {
  7. const [orders, setOrders] = useState([]);
  8. useEffect(() =&gt; {
  9. async function fetchOrders() {
  10. const res = await axios.get(&quot;/api/secret&quot;);
  11. const secret = res.data.secret;
  12. // Get the JWT token from the cookies
  13. const token = cookie.parse(document.cookie).OursiteJWT;
  14. const decoded = jwt.verify(token, secret);
  15. const userId = decoded._id
  16. console.log(userId)
  17. // Fetch the orders for the user from the backend API
  18. const response = await axios.get(`/api/orders?user_id=${userId}`);
  19. const orders = response.data;
  20. setOrders(orders);
  21. }
  22. fetchOrders();
  23. }, []);
  24. return (
  25. &lt;div&gt;
  26. {orders.map((order) =&gt; (
  27. &lt;div key={order._id}&gt;
  28. &lt;h2&gt;Commande {order._id}&lt;/h2&gt;
  29. &lt;p&gt;Utilisateur: {order.name}&lt;/p&gt;
  30. &lt;p&gt;Adresse: {order.address}&lt;/p&gt;
  31. &lt;p&gt;Ville: {order.city}&lt;/p&gt;
  32. &lt;p&gt;Produits:&lt;/p&gt;
  33. &lt;ul&gt;
  34. {order.products.map((product) =&gt; (
  35. &lt;li key={product._id}&gt;{product.name}&lt;/li&gt;
  36. ))}
  37. &lt;/ul&gt;
  38. &lt;/div&gt;
  39. ))}
  40. &lt;/div&gt;
  41. );
  42. }
  43. export default Orders;

I noticed that I can't put console.log in my useffect or in api calls that are in my useffect because my useffect doesn't even run because the problem comes from my model.
If I delete my useffect I still have the same error so the problem does not come from my useffect.

答案1

得分: 1

mongoose 是服务器端的包。你不能在客户端组件中使用 Order 模型。你可以在服务器端代码中使用模型,包括在 API 函数或 getServerSide 函数中。

英文:

mongoose is server-side package. you cannot use the Order model inside client components. You can use models with server-side code, inside api functions or getServerSide functions.

huangapple
  • 本文由 发表于 2023年1月8日 22:00:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/75048338.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定