嗨,我有以下代码:
export function createProduct(req, res) {
console.log("Execution")
const product = new Product({ ...req.body })
product.save(function (err, product) {
if (err) {
console.log("error")
const errorResponse = {}
for (let key in err.errors) {
//ValidationError handler
if (err.errors[key].properties) {
errorResponse[key] = err.errors[key].properties.message
}
//CastError handler
else {
errorResponse[key] = err.errors[key].toString().split(":")[1]
}
}
return res.status(400).send({ ...errorResponse })
}
console.log("created")
return res.send({ product })
})
}
Express端没有错误,console.log(“ Execution”)可以正常工作并正确显示此消息。我使用Postman进行了测试,当我发送一些数据时,响应永远不会到来,并且在Postman上出现错误:“错误:套接字挂起”。
我为req.body创建了console.log,这是我的输出:
{
name: 'Apple Iphone 11 Pro 64GB Space Gray',
category: 'smartphone',
price: 4699,
inMagazine: { blocked: 0, inStock: 40 },
shortDescription: 'Odkryj wszystkie zalety iPhone 11 Pro 512 GB Silver. Smartfona, który zawstydza podkręconą wydajnością. Posiada bowiem najszybszy w historii procesor A13 Bionic oraz baterię, która pozwala na wiele. Weź iPhone 11 Pro do ręki i rób zdjęcia, których nie powstydziłby się nawet profesjonalista. Teraz masz do tego odpowiednie narzędzie – nowy iPhone 11 Pro posiada potrójny aparat główny, działający w oparciu o uczenie maszynowe. Efekty swojej fotograficznej przygody wraz z najmniejszymi detalami możesz ocenić z kolei na olśniewającym ekranie Super Retina XDR.',
images: [ { order: 1, src: '' } ]
}
在那之后,我发现我将检查它为什么挂起,在nodejs控制台中没有任何错误。所以我在代码中添加了两个console.log:
console.log("error")
console.log("created")
但是两者都没有执行。因此,我进行了一些代码重构,其工作原理与上面相同:
export async function createProduct(req, res) {
try {
const product = await Product.create({ ...req.body })
console.log("created")
return res.send({ product })
} catch (err) {
console.log("error")
const errorResponse = {}
for (let key in err.errors) {
//ValidationError handler
if (err.errors[key].properties) {
errorResponse[key] = err.errors[key].properties.message
}
//CastError handler
else {
errorResponse[key] = err.errors[key].toString().split(":")[1]
}
}
return res.status(400).send({ ...errorResponse })
}
}
我不知道是什么原因造成的。 这是整个项目的链接:https://github.com/codemasternode/DietShopping
答案 0 :(得分:1)
假设您知道如果要保存这样的产品,则req.body
中的所有关键字应与Product
模式中的所有关键字相同。
这应该起作用:
exports.createProduct = async (req, res) => {
try{
const product = new Product(req.body).save();
return res.json(product);
}catch(err){
const errorResponse = {}
for (let key in err.errors) {
if (err.errors[key].properties) {
errorResponse[key] = err.errors[key].properties.message
}
else {
errorResponse[key] = err.errors[key].toString().split(":")[1]
}
}
return res.status(400).send({ ...errorResponse })
}
}
答案 1 :(得分:0)
尝试摆脱RES前面的退货。函数调用
赞:
export async function createProduct(req, res) {
try {
const product = await Product.create({ ...req.body })
console.log("created")
res.send({ product })
} catch (err) {
console.log("error")
const errorResponse = {}
for (let key in err.errors) {
//ValidationError handler
if (err.errors[key].properties) {
errorResponse[key] = err.errors[key].properties.message
}
//CastError handler
else {
errorResponse[key] = err.errors[key].toString().split(":")[1]
}
}
res.status(400).send({ ...errorResponse })
}
答案 2 :(得分:0)
我已经预先保存了“产品”模型,这让我无法通过。我正在从其他模型复制和粘贴,却忘记删除unecesarry代码。
答案 3 :(得分:0)
我建议您摆脱该回调并使用干净的async-await。通过使用此代码也将更短。而且我认为这会起作用。试试这个。
export async function createProduct(req, res) {
try{
console.log("Execution")
const product = new Product({...req.body})
let result = await product.save()
console.log("created",result)
return res.send({ product })
}catch(err){
const errorResponse = {}
for (let key in err.errors) {
if (err.errors[key].properties) {
errorResponse[key] = err.errors[key].properties.message
}
else {
errorResponse[key] = err.errors[key].toString().split(":")[1]
}
}
return res.status(400).send({ ...errorResponse })
}
}