如何做select *从在JavaScript中使用knex?

我有这样的function:

function get_projects() { var project_names=[]; knex('projects').select('name').then(function (a) { project_names.push(a); }) return project_names; } 

这个函数执行return语句return project_names; 在完成project_names.push(a)语句之前,我调用这个函数后得到的是一个空数组,即使我的数据库有结果(如果我login函数a(),我可以看到这个)

knex select()返回一个promise,这样你就可以在then()函数内继续stream了。

 knex('projects').select('name').then(function(projectNames){ //do something here console.log(projectNames); }); 

Nodejs是asynchronous的,所以只要你的行knex('projects').select('name').then...被执行,'return project_names'行 运行。 正如你发现的那样,它并没有等到它充满了价值!

方法最后的标准“返回”对于基于事件的Nodejs来说不是一个好的编程风格。 它有它的位置,但更常见的是callback方法。 考虑阅读一些关于这个新方法的教程(我喜欢这个 )

你可能会改变你的当前代码如下所示:

 function print_project_names() { get_projects( function(names){ for( var i = 0; i < names.length; i++ ) { console.log(names[i]+'\n'); } }); } function get_projects( callback ) { var project_names=[]; knex('projects').select('name').then(function (a) { project_names.push(a); callback(project_names); }) } 

注意:这不是优化的代码

在这里,当你想打印项目名称(不确定你真实的目标)时,你将一个实际的函数定义作为“callback”传递给“get_projects”。 当事件触发时,一旦结果被压入到项目名称中,callback就会被新的列表调用。

我知道这是旧的,但你可以这样做:

 function get_projects() { return knex('projects').select('name') .then(function (records) { // already returns an array you can do other things here return records; }) } 

现在你可以做到这一点来访问数据。

 get_projects() .then(function (records) { // do what you need as well, like send to the frontend using express res.send(records); })