为什么我在 NodeJS 中收到这个意外的 HTTP 错误



伙计们,我正在为电子商务网站在 NodeJS 中设置后端。 但是我在尝试实现"订单"方法时遇到了错误。

首先连接到 mysql 数据库:

let mysql = require('mysql')
let connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'ecom_new'
})
connection.connect()
module.exports = connection

然后在我的模型中有一个包含以下方法的客户端类:

static order(orderData, callbackfn) {
orderData.products.map((product) => {
connection.query(`INSERT INTO orders SET
product_name = ?, owner = ?, quantity = ?, price = ?, client_name = ?, client_phone = ?, client_address = ?`,
[product.name, product.owner, product.count,product.price, orderData.clientName, 
orderData.clientPhone, orderData.clientLoc], (err, result) => {
if (err) {
callbackfn(err)
} else {
callbackfn(null, result)
}
})
})

}

order()方法中的orderData参数是从前端发布的 JSON,如下所示:

{
"products": [
{"name": "Item 1", "owner": "Clint", "count": 1, "price": 150},
{"name": "Item 2", "owner": "Steve", "count": 3, "price": 350},
{"name": "Item 3", "owner": "Bruce", "count": 6, "price": 110}
],
"clientName": "Tony Stark",
"clientPhone": "111111",
"clientLoc": "Malibu"
}

最后,处理此请求的路由编码如下:

router.post('/client/order', (req, res) => {

Client.order(req.body, (err, result) => {
if (err) {
res.json({RequestResult: 'ERROR', Message: err['sqlMessage']})
} else {
res.json({RequestResult: 'SUCCESS', Message: 'New order placed successfully'})
}
})

})

当我尝试(一次)从我的前端(和邮递员)下订单时,它工作得很好。

但问题是,每当我尝试(再次)下订单时,我都会收到[ERR_HTTP_HEADERS_SENT]错误。看起来我只能下一次订单,这是无稽之谈。

我真的不知道出了什么问题,它阻止我继续关注我项目的其他问题,需要帮助。

谢谢

我认为问题是你用orderData.products.map((product) => {...迭代产品,对于每个产品,你称之为callbackfn,而又调用res.json({...})。因此,对于每个产品,都会调用一个res.json({...}),但我认为每个请求只能调用一次。

在客户端类中尝试如下操作:

static order(orderData) {
return Promise.all(orderData.products.map((product) => {
return new Promise((resolve, reject) => {
//run query
if (err) reject(err)
else resolve()
})
}))
}

现在你可以像这样使用这个函数:

Client.order(req.body)
.then(() => res.json({ RequestResult: 'SUCCESS', Message: 'New order placed successfully' }))
.catch(err => res.json({ RequestResult: 'ERROR', Message: err['sqlMessage'] }))

最新更新