Node js:Express jsasynchronousdb查询执行 – 返回结果有undefiend

刚开始学习express js框架,下面是我的简单的数据库查询执行部分,它调用了这个url localhost:3000/api/test

 db.query('SELECT * FROM user', function (error, results, fields) { if (error) throw error; console.log('The result is:', results[0].id); return results; }); 

它真的asynchronous吗? 假设另一个用户请求这个url,他是否需要等待以前的查询执行?

我听说过async包,但不知道这是如何适用于我的情况

UPDATE

我得到了正确的结果console.log(); 但是当我返回结果我得到了未定义的错误

这是我的model.js

 module.exports = { getUser:function () { db.query('SELECT * FROM user', function (error, results, fields) { if (error) throw error; console.log('The result is: ', results[0].id); }); } } 

从我的controller.js

 var model = require('../models/user.js'); module.exports = { getData : function(req, res){ //invoke model console.log(model.getUser()); } } 

节点是非阻塞的,当它被调用的时候,它会处理这个请求。

如果另一个用户点击了这个端点,那么无论第一个查询是否完成,它都会再次执行(除非SQLlocking了表,在这种情况下,所有连续的连接/查询都会等待,并可能因此而超时)。 这发生在连接的基础上。

你应该确保检查你的SQL服务器(MySQL?)configuration在这里,以确保有足够的max_connections能够应付你所期望的任何负载。

请记住,应用程序的最大瓶颈usually是数据库。


上面的查询需要一个callback来asynchronous返回数据。

 db.query('SELECT * FROM user', function (error, results, fields) { if (error) throw error; console.log('The result is:', results[0].id); //cb=callback function passed in to context if (cb) cb(results); }); 

从更新的问题更新答案

在你的model.js中:

 module.exports = { getUser:function (cb) { db.query('SELECT * FROM user', function (error, results, fields) { if (error) throw error; console.log('The result is: ', results[0].id); if (cb) cb(results); }); } } 

在你的controller.js中:

 module.exports = { getData : function(req, res){ //invoke model model.getUser(function(results) { console.log(results); }); } } 

当你处理callback时,处理它们的安全和干净的方法是Promises。 它现在是JavaScript的标准,不需要任何模块。

是的,这是asynchronous的。 在后面,将会有数据库服务器的networking访问和对话。 只有当他们完成聊天时,才会调用callback。

 module.exports = { getUser: function () { // wrap asynchronously called callback in Promise new Promise((resolve, reject) => { db.query("SELECT * FROM user", (error, results, fields) => { if (error) { reject(error); // similar to "throw" } else { resolve({ results, fields }); // similar to "return" } }); }); } }; 

你如何使用它:

香草符号:

 // similar to "try" model.getUser() .then((answer) => { console.log("answer", answer); }) // similar to "catch" .catch((error) => { console.log("error", error); }); 

async-await符号(仅适用于最新版本的nodejs和浏览器):

 // you must be in an async environement to use "await" async function wrapper() { try { var answer = await model.getUser(); // wait for Promise resolution console.log("answer", answer); } catch(error) { console.log("error", error); } } // async function return automatically a Promise so you can chain them easily wrapper();