我正在尝试将查询传递给我的数据库,然后将结果发送到我的客户端,但看起来请求是异步的,因为我的请求发生在我的post请求返回值之后。
如何设置等待请求?
我的数据库连接
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'my_password',
database: 'MEETME'
});
connection.connect(function(err) {
if (err) {
console.log("error while connecting to database");
console.log(err.code);
}
});
// function that query database <-------
function queryDatabase(userQuery) {
connection.query(userQuery, function(err, result) {
if (err) {
throw err;
}
console.log("before");
return result;
});
}
这是我的帖子请求
//POST
app.post('/signin', function(request, response) {
var query = queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
console.log(query);
console.log("after");
response.end(query, 200);
});
控制台中的结果是:
undefined
after
before
答案 0 :(得分:2)
更改queryDatabase函数的实现以返回promise。可以等待任何返回promise的函数。
function queryDatabase(userQuery){
return new Promise((resolve,reject) => {
connection.query(userQuery, function(err, result){
if(err){
reject(err);
}
console.log("before");
resolve(result);
});
});
}
app.post('/signin', async function(request, response){
var query = await queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
console.log(query);
console.log("after");
response.end(query, 200);
});
答案 1 :(得分:2)
欢迎使用Node.js,其中所有内容都是异步的,除非您以一种将一个事件级联到另一个事件的方式显式构建代码,否则代码部分没有义务以任何特定顺序运行。< / p>
如果您不熟悉这个概念,我强烈建议您使用Promises作为组织代码的方式。这将一些棘手的编程包含在一些整洁,整洁的方法中,并且使链接,扇出和扇入实际上非常简单。
例如,使用Sequelize重写,使用promises的数据库层:
function queryDatabase(userQuery){
console.log("before");
return connection.query(userQuery);
}
您返回承诺,并且用于链接。如果你不这样做,必须接受一个回调参数并通过它链接。返回值在很大程度上被忽略:
function queryDatabase(userQuery, cb){
connection.query(userQuery, function(err, result){
cb(err, result);
});
console.log("before");
}
你可以看到已经有更多的东西了,如果你需要建立它的话还有更多。在回调驱动代码中插入可选步骤棘手。
Promise使您的代码最终看起来像这样:
app.post('/signin', function(request, response){
queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3")
.then(function(results) {
console.log(results);
console.log("after");
response.end(query, 200);
});
});
使用catch
在错误处理中修补错误处理也是微不足道的。