Javascript 你怎么称呼“第二个”呢;“外部”;使用Nodejs、Expressjs和bluebird的函数

Javascript 你怎么称呼“第二个”呢;“外部”;使用Nodejs、Expressjs和bluebird的函数,javascript,node.js,express,bluebird,Javascript,Node.js,Express,Bluebird,我正在构建一个nodejs(我对它很陌生)应用程序。我已经学会了使用承诺,并且能够从数据库中提取数据。您可以在这里看到我正在使用的代码: myModel.js var express = require('express'); var app = express(); var Promise = require("bluebird"); var mysql = require('../helpers/db'); // handle a get request exports.post = fu

我正在构建一个nodejs(我对它很陌生)应用程序。我已经学会了使用承诺,并且能够从数据库中提取数据。您可以在这里看到我正在使用的代码:

myModel.js

var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    function getData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select id from someTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    function getMoreData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select * from anotherTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    getData().then(
        function(data)
        {
            console.log(data); // Log the value once it is resolved
            return data;
        })
    ).then(
        function(d)
        {
            console.log(d);
        }
    ).catch(
        function(err) 
        {
            console.log(err)
        }
    );
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    return new Promise(function(resolve, reject)
    {
        mysql.getResults('select id from sometable order by id', function(err, rows1) 
        {
            // console.log(rows1[0]);
            mysql.getResults('select field1, field2 from someothertable where id=' + rows1[0].id, function(err, rows2) 
            {
                resolve(rows2);
            });
        })
    }).then(function (params) 
    {
        callback(null, params);
    });
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post =  function (params, callback) {
    function getData(){
        return new Promise(function (resolve,reject){
            mysql.getResults('select username from user', function (err, rows1) {
                mysql.getResults("select * from user where username = '" + rows1[0].username + "'", function (err, rows2) {
                    resolve(rows2);
                })
            });
        });
    }

    getData()
    .then(function (params, etc) {
        console.log('params',params);
    });

}
../helpers/db.js

var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXXX',
    password : 'XXXXXX'
});

var executeQuery = Promise.promisify(function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
})
var getResults = Promise.promisify(function getResult(query,callback) {
  executeQuery(query, function (err, rows) {
     if (!err) {
        callback(null,rows);
     }
     else {
        callback(true,err);
     }
   });
})

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXX',
    password : 'XXXXX'
});

var executeQuery = function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
}
var getResults = function getResult(query,callback) 
{
    executeQuery(query, function (err, rows) 
    {
        if (!err) 
        {
            callback(null,rows);
        }
        else 
        {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XX',
    port     : 3306,
    host     : 'XX',
    user     : 'XX',
    password : 'XX'
});

var executeQuery = function (query, callback) {
pool.getConnection(function (err, connection) {
    if (err) {
        return callback(err, null);
    }
    else if (connection) {
        connection.query(query, function (err, rows, fields) {
            connection.release();
            if (err) {
                return callback(err, null);
            }
            return callback(null, rows);
        })
    }
    else {
        return callback("No connection", null);
    }
});
}
var getResults = function (query,callback) {
    return executeQuery(query, function (err, rows) {
        if (!err) {
            callback(null,rows);
        }
        else {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
这一切都很好。现在,如果我还想从函数getMoreData中提取数据呢?目标是使用getData中的数据来查询getMoreData中的数据,并将结果进一步推到“then”链的下游

我脑子里一直在想这是怎么回事……我整天都在想这个

谢谢你的帮助

*****编辑*****

以下是我发现的有效方法:

myModel.js

var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    function getData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select id from someTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    function getMoreData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select * from anotherTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    getData().then(
        function(data)
        {
            console.log(data); // Log the value once it is resolved
            return data;
        })
    ).then(
        function(d)
        {
            console.log(d);
        }
    ).catch(
        function(err) 
        {
            console.log(err)
        }
    );
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    return new Promise(function(resolve, reject)
    {
        mysql.getResults('select id from sometable order by id', function(err, rows1) 
        {
            // console.log(rows1[0]);
            mysql.getResults('select field1, field2 from someothertable where id=' + rows1[0].id, function(err, rows2) 
            {
                resolve(rows2);
            });
        })
    }).then(function (params) 
    {
        callback(null, params);
    });
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post =  function (params, callback) {
    function getData(){
        return new Promise(function (resolve,reject){
            mysql.getResults('select username from user', function (err, rows1) {
                mysql.getResults("select * from user where username = '" + rows1[0].username + "'", function (err, rows2) {
                    resolve(rows2);
                })
            });
        });
    }

    getData()
    .then(function (params, etc) {
        console.log('params',params);
    });

}
../helpers/db.js

var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXXX',
    password : 'XXXXXX'
});

var executeQuery = Promise.promisify(function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
})
var getResults = Promise.promisify(function getResult(query,callback) {
  executeQuery(query, function (err, rows) {
     if (!err) {
        callback(null,rows);
     }
     else {
        callback(true,err);
     }
   });
})

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXX',
    password : 'XXXXX'
});

var executeQuery = function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
}
var getResults = function getResult(query,callback) 
{
    executeQuery(query, function (err, rows) 
    {
        if (!err) 
        {
            callback(null,rows);
        }
        else 
        {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XX',
    port     : 3306,
    host     : 'XX',
    user     : 'XX',
    password : 'XX'
});

var executeQuery = function (query, callback) {
pool.getConnection(function (err, connection) {
    if (err) {
        return callback(err, null);
    }
    else if (connection) {
        connection.query(query, function (err, rows, fields) {
            connection.release();
            if (err) {
                return callback(err, null);
            }
            return callback(null, rows);
        })
    }
    else {
        return callback("No connection", null);
    }
});
}
var getResults = function (query,callback) {
    return executeQuery(query, function (err, rows) {
        if (!err) {
            callback(null,rows);
        }
        else {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;

我接受了这个答案,因为它让我获得了90%的成功。使用添加的承诺是获得要解析的第二个getResults的唯一方法。然后,我删除了helpers/db中的承诺,这缓解了反模式问题。

那么,您是说要将第一个查询的结果用作第二个查询的参数吗?因为如果是,那么就需要嵌套调用。因此,不要解析第一个查询。因为这是一个可以解决的承诺,所以它应该是可以解决的

像这样的东西可能是你想要的

    exports.post = function (params, callback) {
       mysql.getResults('select id from someTable', function (err, rows1) {
        mysql.getResults('select * from anotherTable', function (err, rows2) {
          resolve(rows2);
        });
      }).then(function (params, etc) {
        console.log(params);
      });
    }
编辑:我实际上已经看过了,这里有一个只使用一个承诺的解决方案:

helpers/db.js

var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXXX',
    password : 'XXXXXX'
});

var executeQuery = Promise.promisify(function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
})
var getResults = Promise.promisify(function getResult(query,callback) {
  executeQuery(query, function (err, rows) {
     if (!err) {
        callback(null,rows);
     }
     else {
        callback(true,err);
     }
   });
})

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXX',
    password : 'XXXXX'
});

var executeQuery = function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
}
var getResults = function getResult(query,callback) 
{
    executeQuery(query, function (err, rows) 
    {
        if (!err) 
        {
            callback(null,rows);
        }
        else 
        {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XX',
    port     : 3306,
    host     : 'XX',
    user     : 'XX',
    password : 'XX'
});

var executeQuery = function (query, callback) {
pool.getConnection(function (err, connection) {
    if (err) {
        return callback(err, null);
    }
    else if (connection) {
        connection.query(query, function (err, rows, fields) {
            connection.release();
            if (err) {
                return callback(err, null);
            }
            return callback(null, rows);
        })
    }
    else {
        return callback("No connection", null);
    }
});
}
var getResults = function (query,callback) {
    return executeQuery(query, function (err, rows) {
        if (!err) {
            callback(null,rows);
        }
        else {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
myModel.js

var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    function getData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select id from someTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    function getMoreData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select * from anotherTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    getData().then(
        function(data)
        {
            console.log(data); // Log the value once it is resolved
            return data;
        })
    ).then(
        function(d)
        {
            console.log(d);
        }
    ).catch(
        function(err) 
        {
            console.log(err)
        }
    );
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    return new Promise(function(resolve, reject)
    {
        mysql.getResults('select id from sometable order by id', function(err, rows1) 
        {
            // console.log(rows1[0]);
            mysql.getResults('select field1, field2 from someothertable where id=' + rows1[0].id, function(err, rows2) 
            {
                resolve(rows2);
            });
        })
    }).then(function (params) 
    {
        callback(null, params);
    });
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post =  function (params, callback) {
    function getData(){
        return new Promise(function (resolve,reject){
            mysql.getResults('select username from user', function (err, rows1) {
                mysql.getResults("select * from user where username = '" + rows1[0].username + "'", function (err, rows2) {
                    resolve(rows2);
                })
            });
        });
    }

    getData()
    .then(function (params, etc) {
        console.log('params',params);
    });

}

编辑2:我刚刚注意到你已经更新了你的问题以显示答案-与我的答案相同。所以+1。

那么您是说要将第一个查询的结果用作第二个查询的参数?因为如果是,那么就需要嵌套调用。因此,不要解析第一个查询。因为这是一个可以解决的承诺,所以它应该是可以解决的

像这样的东西可能是你想要的

    exports.post = function (params, callback) {
       mysql.getResults('select id from someTable', function (err, rows1) {
        mysql.getResults('select * from anotherTable', function (err, rows2) {
          resolve(rows2);
        });
      }).then(function (params, etc) {
        console.log(params);
      });
    }
编辑:我实际上已经看过了,这里有一个只使用一个承诺的解决方案:

helpers/db.js

var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXXX',
    password : 'XXXXXX'
});

var executeQuery = Promise.promisify(function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
})
var getResults = Promise.promisify(function getResult(query,callback) {
  executeQuery(query, function (err, rows) {
     if (!err) {
        callback(null,rows);
     }
     else {
        callback(true,err);
     }
   });
})

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XXXXX',
    port     : 3306,
    host     : 'localhost',
    user     : 'XXXXX',
    password : 'XXXXX'
});

var executeQuery = function executeQuery(query, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        else if (connection) {
            connection.query(query, function (err, rows, fields) {
                connection.release();
                if (err) {
                    return callback(err, null);
                }
                return callback(null, rows);
            })
        }
        else {
            return callback("No connection", null);
        }
    });
}
var getResults = function getResult(query,callback) 
{
    executeQuery(query, function (err, rows) 
    {
        if (!err) 
        {
            callback(null,rows);
        }
        else 
        {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
    connectionLimit: 10,
    database : 'XX',
    port     : 3306,
    host     : 'XX',
    user     : 'XX',
    password : 'XX'
});

var executeQuery = function (query, callback) {
pool.getConnection(function (err, connection) {
    if (err) {
        return callback(err, null);
    }
    else if (connection) {
        connection.query(query, function (err, rows, fields) {
            connection.release();
            if (err) {
                return callback(err, null);
            }
            return callback(null, rows);
        })
    }
    else {
        return callback("No connection", null);
    }
});
}
var getResults = function (query,callback) {
    return executeQuery(query, function (err, rows) {
        if (!err) {
            callback(null,rows);
        }
        else {
            callback(true,err);
        }
    });
}

exports.getResults = getResults;
myModel.js

var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    function getData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select id from someTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    function getMoreData() 
    {
        return new Promise(function(resolve, reject) 
        {
            mysql.getResults('select * from anotherTable',function(err, rows) 
            {
                resolve(rows);
            });
        });
    }

    getData().then(
        function(data)
        {
            console.log(data); // Log the value once it is resolved
            return data;
        })
    ).then(
        function(d)
        {
            console.log(d);
        }
    ).catch(
        function(err) 
        {
            console.log(err)
        }
    );
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post = function(params, callback) 
{
    return new Promise(function(resolve, reject)
    {
        mysql.getResults('select id from sometable order by id', function(err, rows1) 
        {
            // console.log(rows1[0]);
            mysql.getResults('select field1, field2 from someothertable where id=' + rows1[0].id, function(err, rows2) 
            {
                resolve(rows2);
            });
        })
    }).then(function (params) 
    {
        callback(null, params);
    });
}
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');

// handle a get request
exports.post =  function (params, callback) {
    function getData(){
        return new Promise(function (resolve,reject){
            mysql.getResults('select username from user', function (err, rows1) {
                mysql.getResults("select * from user where username = '" + rows1[0].username + "'", function (err, rows2) {
                    resolve(rows2);
                })
            });
        });
    }

    getData()
    .then(function (params, etc) {
        console.log('params',params);
    });

}

编辑2:我刚刚注意到你已经更新了你的问题以显示答案-与我的答案相同。所以+1。

那么您是说要将第一个查询的结果用作第二个查询的参数?因为如果是,那么就需要嵌套调用。因此,不要解析getData()中的第一个查询(解析(行);而是返回getMoreData(参数);因为它是一个解析的承诺,所以它应该会正常工作。另外,当您从getResults返回承诺时,您不需要在getData中创建新的承诺;那么您是说要将第一个查询的结果用作第二个查询的参数吗?因为如果是,则需要嵌套调用。因此,不要解析第一个查询ry(resolve(rows);在getData()中。相反,请返回getMoreData(parameters);因为这是一个解析的承诺,所以它应该会正常工作。此外,当您从getResults返回承诺时,您不需要在getData中创建新的承诺;给我一个“resolve is not defined”(解析未定义)错误。但是我现在可以使用query one作为query two的参数,所以这就是进程。因为getResults是一个承诺,我不明白为什么它不能被解析。下面是工作原理:`exports.post=function(params,callback){return new promission(function(resolve,reject){mysql.getResults('select id from sometable order by id',function(err,rows1){//console.log(rows1[0]);mysql.getResults('select field1,field2 from somethertable,其中id='+rows1[0]。id,function(err,rows2){resolve(rows2);});})。然后(function(params){callback callback(null,params);})当我意识到我做错了!我更新了答案,以显示如何在系统中仅使用1个承诺就可以做到这一点给我一个“未定义解决方案”错误。但是我现在可以使用query one作为query two的参数,所以这就是进程。因为getResults是一个承诺,我不明白为什么它不能被解析。下面是工作原理:`exports.post=function(params,callback){return new promission(function(resolve,reject){mysql.getResults('select id from sometable order by id',function(err,rows1){//console.log(rows1[0]);mysql.getResults('select field1,field2 from somethertable,其中id='+rows1[0]。id,function(err,rows2){resolve(rows2);});})。然后(function(params){callback callback(null,params);})当我意识到我做错了!我更新了答案,展示了如何在系统中只使用一个承诺