Dart向Node.js发POST请求报“Product is not a constructor”错误排查
问题:Flutter向Node.js发送POST请求添加商品时出现"Product is not a constructor"错误
问题背景
我正在开发Flutter应用,通过Dart向Node.js服务器发送POST请求添加商品,但服务器返回“Product is not a constructor”错误。
客户端相关代码
admin_services.dart
import 'dart:convert'; import 'dart:io'; import 'package:cloudinary_public/cloudinary_public.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; import 'package:swadesh/constants/errors.dart'; import 'package:swadesh/constants/global_variables.dart'; import 'package:swadesh/constants/utils.dart'; import 'package:swadesh/models/product.dart'; import 'package:swadesh/providers/user_provider.dart'; class AdminServices { void sellProduct({ required BuildContext context, required String name, required String description, required double price, required double quantity, required String category, required List<File> images, }) async { final userProvider = Provider.of<UserProvider>(context, listen: false); try { final cloudinary = CloudinaryPublic('dypdblusf', 'pmfi2yqj'); List<String> imageUrls = []; // Upload images to Cloudinary and collect URLs for (int i = 0; i < images.length; i++) { CloudinaryResponse res = await cloudinary.uploadFile( CloudinaryFile.fromFile(images[i].path, folder: name), ); imageUrls.add(res.secureUrl); } // Create product object Product product = Product( name: name, description: description, quantity: quantity, images: imageUrls, category: category, price: price, ); // Convert product object to JSON String jsonBody = json.encode(product.toMap()); // Send HTTP POST request to server http.Response res = await http.post( Uri.parse('$uri/admin/add-product'), headers: { 'Content-Type': 'application/json; charset=UTF-8', 'x-auth-token': userProvider.user.token, }, body: jsonBody, ); // Handle the response httpErrorHandle( response: res, context: context, onSuccess: () { showSnackBar(context, 'Product Added Successfully!'); Navigator.pop(context); }, ); } catch (e) { showSnackBar(context, e.toString()); } } }
product.dart
import 'dart:convert'; class Product { final String name; final String description; final double quantity; final List<String> images; final String category; final double price; Product({ required this.name, required this.description, required this.quantity, required this.images, required this.category, required this.price, }); Map<String, dynamic> toMap() { return <String, dynamic>{ 'name': name, 'description': description, 'quantity': quantity, 'images': images, 'category': category, 'price': price, }; } factory Product.fromMap(Map<String, dynamic> map) { return Product( name: map['name'], description: map['description'], quantity: map['quantity'].toDouble(), images: List<String>.from(map['images']), category: map['category'], price: map['price'].toDouble(), ); } String toJson() => json.encode(toMap()); factory Product.fromJson(String source) => Product.fromMap(json.decode(source)); }
服务器返回错误
{ "error": "Product is not a constructor" }
已确认信息
- 服务器端Product模型定义与导入无误
- 发送的JSON payload格式正确
- Dart端Product类结构与Node.js端预期一致
成因分析及解决方法
该错误完全出在Node.js服务器端,与Flutter客户端代码无关。以下是常见触发场景及修复方案:
1. 模型导入方式错误
若Node.js代码中错误地将默认导出当作命名导入,会导致Product不是构造函数:
// 错误写法(假设Product是默认导出) const { Product } = require('./models/Product'); // 正确写法(根据导出方式选择): // CommonJS默认导出 const Product = require('./models/Product'); // ES模块默认导出 import Product from './models/Product.js';
2. 模型定义语法错误
检查Node.js的Product模型文件,确保类/Schema定义正确:
// 错误示例:类名拼写错误、未正确定义模型 class Prodcut { // 拼写错误 // ... } // 正确示例(以Mongoose为例): const mongoose = require('mongoose'); const ProductSchema = new mongoose.Schema({ name: String, description: String, quantity: Number, images: [String], category: String, price: Number }); // 确保正确导出模型 module.exports = mongoose.model('Product', ProductSchema);
3. 变量名冲突
检查服务器代码中是否有同名变量覆盖了Product模型引用:
// 错误示例:变量名冲突导致模型被覆盖 const Product = 'some string'; // 正确:确保模型变量名唯一且未被重新赋值 const Product = require('./models/Product');
4. 异步模块加载问题
若使用动态导入,需等待模块加载完成再使用:
// 错误示例:未等待动态导入完成,得到的是Promise而非类 const Product = import('./models/Product'); // 正确写法: async function addProduct(req, res) { const { default: Product } = await import('./models/Product.js'); const newProduct = new Product(req.body); // 后续保存逻辑 }
内容的提问来源于stack exchange,提问作者TUSHAR MISHRA
相关产品推荐
相关产品推荐

