我的应用程序使用 Android 模拟器设备以及运行支持的节点的端口连接到 node.js
final serverUrl = 'http://10.0.2.2:3000';
我已经在我的应用程序中实现了 CRUD。 每次我尝试更新和删除应用程序中的项目时,都会引发代码中处理的异常。此外,该项目不会被删除或更新。
Future<List<Item>> fetchItems() async {
final response = await http.get(Uri.parse('$serverUrl/api/v1/items'));
if (response.statusCode == 200) {
final List<dynamic> itemList = jsonDecode(response.body);
final List<Item> items =
itemList.map((json) => Item.fromJson(json)).toList();
return items;
} else {
throw Exception('Failed to fetch items');
}
}
Future<Item> addItem(String name) async {
final response = await http.post(Uri.parse('$serverUrl/api/v1/items'),
headers: {'content-type': 'application/json'},
body: jsonEncode({'name': name}));
if (response.statusCode == 200) {
final dynamic json = jsonDecode(response.body);
final Item item = Item.fromJson(json);
return item;
}else{
throw Exception('Failed to fetch item');
}
}
Future<void> updateItem(int id, String name) async {
final response = await http.delete(
Uri.parse('$serverUrl/api/v1/items/$id'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({"name": name}),
);
if (response.statusCode != 200) {
throw Exception('Failed to update item');
}
}
Future<void> deleteItem(int id) async {
final response = await http.delete(Uri.parse('$serverUrl/api/v1/items/$id'));
if (response.statusCode != 200) {
throw Exception('Failed to delete item');
}
}
触发更新和删除的代码
IconButton(
icon: const Icon(Icons.edit),
onPressed: () {
dialog('Edit item', 'Edit', onPressed: () {
updateItem(item.id, nameController.text);
Navigator.pop(context);
});
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
dialog('Add item', 'Item name', onPressed: () {
addItem(nameController.text);
Navigator.pop(context);
});
},
tooltip: 'Add button',
child: const Icon(Icons.add),
)
下面是更新和删除的后端代码
const express = require('express');
const app = express();
const port = process.env.port || 3000;
onst itemList = [
{id: 1, name: 'name here'},
];
app.put('/api/v1/items/:id', (req, res) => {
let itemId = req.params.id;
let updatedItem = {
id: itemId,
name: req.body.name
}
const index = itemList.findIndex(item => item.id === itemId);
if(index !== -1){
itemList[index] = updatedItem
res.json(updatedItem);
}else{
res.status(404).json({message: 'Item not found'})
}
})
app.delete('/api/v1/items/:id', (req, res) => {
let itemId = req.params.id;
let index = itemList.findIndex(item => item.id === itemId);
if(index!== -1){
let deletedItem = itemList.splice(index, 1);
res.json(deletedItem[0])
}else{
res.status(404).json({message: 'Item not found'})
}
})
我第一眼看到的唯一错误是你在
http.delete
函数中使用了 updateItem
,我想这就是更新不起作用的原因(但它仍然应该删除该项目)。
错误发生在哪里?应用程序是否实际到达服务器(添加一些
console.log
或断点来检查这一点),服务器是否获得正确的参数并执行正确的操作?它是否返回预期的状态代码?然后回到 Flutter 应用程序中,您能看到相同的代码(再次使用断点或打印语句)吗?
我希望这可以帮助您找到问题所在,并使问题变得不那么广泛。