我有一个api代码,如下所示,是通过Node.js编写的。js是异步的,所以下一步在db查询结果之前执行。在那个时候系统还没有得到数据,所以出了错误。我已经搜索了回调结构,承诺和等待,但不能解决它。谢了。
var dateTime = require("node-datetime");
var dt = dateTime.create();
module.exports = {
myOrderImportFromFileAPI: (req, res) => {
//let age = req.params.Age;
// send the player's details to the database
let userName = req.body.userName;
let companyID = req.body.companyId;
let channelId = req.body.channelId;
let orders = req.body.orders;
//default values
let orderTypeId = 1;
let orderStatusId = 1;
let createdDate = dt.format("Y-m-d H:M:S");
let getDate = dt.format("Y-m-d H:M:S");
db.query(`select ID,Code from operationcenters where CompanyID=${companyID}`, (err, result) => {
if (err) {
return res.status(500).send(err);
}
var operationCenterId = result[0].ID
result.find((e) => console.log(e.ID));
});
console.log("operationCenterId");
console.log(operationCenterId);
console.log("channelId");
console.log(channelId);
console.log(orders);
let query = "select ID value, Name label from channels"
db.query(query, (err, result) => {
if (err) {
return res.status(500).send(err);
}
res.send(`1`);
});
},
};
const dateTime = require("node-datetime");
const dt = dateTime.create();
const myOrderImportFromFileAPI = async (req, res) => {
const { userName, companyID, channelId, orders } = req.body
const orderTypeId = 1;
const orderStatusId = 1;
const createdDate = dt.format("Y-m-d H:M:S");
const getDate = dt.format("Y-m-d H:M:S");
try {
const queryData = await queryDatabase()
res.send(queryData).status(200)
} catch(error) {
res.send(error).status(500)
}
}
function queryDatabase() {
const query = "select ID value, Name label from channels"
return new Promise((resolve, reject) => {
db.query(query, (err, result) => {
if (err) {
reject(err)
}
resolve(result)
});
})
}
像上面这样的安慰会让你上路的。我还没有测试过这个,所以我不能说它100%工作,但这是一个很好的起点。这是因为默认情况下,mysql db不支持异步的现代方式。这就是为什么很多人用蓝鸟(?)这是一个用于创建承诺的库,承诺经常依赖于驱动程序等。因此,您所做的是创建一个异步函数,该函数具有const myOrderImportFromFileAPI=async(req,res)=>;{}
之后创建变量,因为您没有重新声明它们,所以使用const
函数声明之后的第一行是析构对象。既然我们知道了数据的名称,并将其命名为这样的名称,那么您就可以用它来节省行数,并使其更易于理解。
最后,我们将异步调用包装在try catch语句中,因为我们调用的是一个返回承诺的函数(我们不需要调用nameasync function querydatabase
,因为我们没有在内部执行任何异步操作)
在实际函数QueryDatabase
中,我们将返回一个解析值result
或返回一个被拒绝的值err
,该值将在try catch语句中捕获,并发送相应的响应。
我希望这能帮上忙!